60120


Visual Studio 2019を使っております．初心者です．  
プログラミングに対する知識はそれほどありません．

先日，Visual Studio 2019を使用して，サンプルプログラムを実行したところ，  
`#include <termios.h>`  
`#include <unistd.h>`  
の所にエラーが出て，termios.hとunistd.hのソースファイルがないとのことだったので，ソリューションエクスプローラー内の外部依存関係にtermios.hとunistd.hを入れ込んだところ，unistd.hは問題なかったのですが，termios.hを開くと，  
`#error "Never include <bits/termios.h> directry; use <termios.h> instead."`  
というエラーが出て，困っています．

解決策と可能であれば原因を教えていただけないでしょうか．


CC BY-SA 4.0
2019-10-30T06:57:35.150
60118
2019-11-01T03:32:57.427
36415
question
c++
termios.hについてエラーが出ており，解決策がわからず困っています．


**訂正：解決策**  
@774RR さん回答や @sayuri
さん紹介記事のように、「初心者」であるならば、目的と手段の両方に一番近い簡単な方法を取るべきで、以下のいずれかになるでしょう。

  * 今扱っているサンプルプログラムは忘れて、Visual Studio 2019でWindows(10?)のCOMポート(SerialPort)を素直に扱ったサンプルプログラムを探して乗り換えましょう。

  * 今はVisual Studio 2019を使っているが、本当にやりたいのは扱っているサンプルプログラムが実現する「何か」というのであれば、最初からUnix系環境(各Linux/MacOS/BSD等)に移行しましょう。

  * 小型ボードコンピュータのような性能/機能/メモリが不十分な環境用に作りたい時に、初めて下記に紹介したVisual Studio 2019での「C++ による Linux 開発ワークロード」による開発が意味を持ちます。ただし「初心者」ならば、扱いやすいWindows環境で経験を積んでから手を出した方が良いでしょう。

今まで扱ってきたUnix系プログラムの経験を生かしてWindowsへ切り替えたい場合に、同等の機能を両方で実現している、こんな例が参考になるかもしれません。  
Linux用 ：[RS232C の入出力を行うプログラム](http://onishi-
lab.jp/programming/rs232c_linux.html)  
Windows用：[RS232C の入出力を行うプログラム](http://onishi-
lab.jp/programming/rs232c_win.html)

純粋にWindows系で探すと、こんな記事が出てきます。  
古いのばかりなので、今Visual Studio 2019でそのままとはいかないでしょうが、大部分は流用出来るのでは？

[Serial Port (RS -232) Connection in
C++](https://stackoverflow.com/q/15794422/9014308)  
[Serial Communication in
Windows](https://www.codeproject.com/Articles/2682/Serial-Communication-in-
Windows)  
[Serial Port Sample](https://code.msdn.microsoft.com/windowsdesktop/Serial-
Port-Sample-e8accf30)  
[Serial Communications](https://docs.microsoft.com/en-us/previous-
versions/ff802693\(v=msdn.10\))  
[Serial Port Programming using Win32 API](https://www.xanthium.in/Serial-Port-
Programming-using-Win32-API)

* * *

**原因**  
おそらくVisual Studio の構成で、「C++ による Linux
開発ワークロード」をインストールせずに、サンプルプロジェクトをコピーし、どこかから間違った`termios.h`を入手したものと思われます。

例えば、gnu のサイトでは無いですが、  
以下が該当すると思われる間違ったファイルと、そのエラーメッセージ部分  
[glibc/sysdeps/unix/sysv/linux/bits/termios.h](https://github.com/lattera/glibc/blob/master/sysdeps/unix/sysv/linux/bits/termios.h)

>
[code]

>     #ifndef _TERMIOS_H
>     # error "Never include <bits/termios.h> directly; use <termios.h>
> instead."
>     #endif
>  
[/code]

同じサイトの本来インクルードしておくべきと思われるファイル  
[glibc/include/termios.h](https://github.com/lattera/glibc/blob/master/include/termios.h)

>
[code]

>     #ifndef _TERMIOS_H
>     #include <termios/termios.h>
>  
[/code]

[glibc/termios/termios.h](https://github.com/lattera/glibc/blob/master/termios/termios.h)

>
[code]

>     #ifndef   _TERMIOS_H
>     #define _TERMIOS_H  1
>  
[/code]

* * *

Visual Studio 2019
については、以下のページなどから始まるインストールとセットアップの手順にしたがって、開発環境を整えてから、現在試そうとしているサンプルプログラム/プロジェクトを再度ダウンロード・展開して始める方が良いでしょう。  
**ただし、ビルドするためだけでも WSL,仮想環境のLinuxVM,Linuxマシン のいずれかが必要です。**

[Linux ワークロードのダウンロード、インストール、セットアップ](https://docs.microsoft.com/ja-
jp/cpp/linux/download-install-and-setup-the-linux-development-
workload?view=vs-2019)  
[Visual Studio でターゲットの Linux システムに接続する](https://docs.microsoft.com/ja-
jp/cpp/linux/connect-to-your-remote-linux-computer?view=vs-2019)  
[新しい Linux プロジェクトを作成する](https://docs.microsoft.com/ja-jp/cpp/linux/create-a-
new-linux-project?view=vs-2019)  
[Linux プロジェクトを構成する](https://docs.microsoft.com/ja-jp/cpp/linux/configure-a-
linux-project?view=vs-2019)  
[Linux CMake プロジェクトの作成と構成](https://docs.microsoft.com/ja-jp/cpp/linux/cmake-
linux-project?view=vs-2019)  
[チュートリアル:Visual Studio で C++ クロスプラットフォーム
プロジェクトを作成する](https://docs.microsoft.com/ja-jp/cpp/build/get-started-linux-
cmake?view=vs-2019)

* * *

例えばWSLなら、こんな記事に概要が出ています。  
[WSL その82 -
Ubuntuからシリアルデバイス（COMポート）にアクセス可能に](https://kledgeb.blogspot.com/2017/04/wsl-82-ubuntucom.html)  
英語版の元情報記事 [Serial Support on the Windows Subsystem for
Linux](https://blogs.msdn.microsoft.com/wsl/2017/04/14/serial-support-on-the-
windows-subsystem-for-linux/)

小型ボードコンピュータのLinuxなら、こんな構成/プログラム例があります。  
[シリアル通信プログラム概説](http://irobot.csse.muroran-it.ac.jp/html-
corner/robotMaker/elements/outlineSerialCommProgramming/index.html)

* * *

**補足**  
今扱っているサンプルプログラムをなるべく変更せずにWindows/Unix両方で扱いたい場合は、困難な道になりますが、以下の様な両環境の互換性向上を狙ったライブラリを利用する手段もあります。

どこまでの機能がサポートされているかは不明ですが、`termios`互換ライブラリを作った先人の仕事が公開されているようです。  
[ChristianVisintin/termiWin](https://github.com/ChristianVisintin/termiWin)

> ~ A termios porting for Windows ~  
>  termiWin is a library which purpose is to allow you to use on a Windows
> system, the same code used in Linux to communicate with a device through a
> serial port. This is possible because termios's functions have been
> rewritten to be compatible with Windows's COM functions.

ついでに、`unistd.h`や`getopt.h`のWindows移植版(最低限?)はこちらの記事で、古いVisualStudio向けのようですが、これをベースに出来るかもしれません。  
[Is there a replacement for unistd.h for Windows (Visual
C)?](https://stackoverflow.com/q/341817/9014308)  
[Full getopt Port for Unicode and Multibyte Microsoft Visual C, C++, or MFC
Projects](https://www.codeproject.com/Articles/157001/Full-getopt-Port-for-
Unicode-and-Multibyte-Microso)

上記で何とか出来ず問題が発生した場合は、自分で何とかする、という以下の英語記事が参考になりそうですが、上記以上に非常に困難な道でしょう。  
[What is the Windows equivalent to the capabilities defined in sys/select.h
and termios.h](https://stackoverflow.com/q/933745/9014308)


CC BY-SA 4.0
2019-10-30T07:29:20.693
60120
2019-11-01T03:32:57.427
2019-11-01T03:32:57.427
26370
26370
60118
answer


VisualStudio 2019 ってことはあなたは Windows 上で開発を行い、できたプログラムも Windows 上で動かしたいということですね？

`<termios.h>` は [linux](/questions/tagged/linux "'linux' のタグが付いた質問を表示")
の「ターミナル」画面を制御するための機能を提供するヘッダなので Visual Studio には付属していません。Windows
ネイティブアプリの画面制御に使う機能は `<termios.h>` には入っていないので当然です。
[linux](/questions/tagged/linux "'linux' のタグが付いた質問を表示")
からテキトーなヘッダファイルを勝手に持ってきても Windows にはターミナル画面を制御する機能が入っていませんから当然動作しません。

ではどうすればよいかは、どうしたいかで違います。

  1. `<termios.h>` をどうしても使いたい

開発環境を Linux に切り替えてください（そのほうが手っ取り早い）

  2. `<termios.h>` はどうでもいいから Windows 上で動くプログラムを開発したい

参考文献を違うものに切り替えてください。

  3. Windows 上で `<termios.h>` をどうしても使いたい

WSL でできるかもしれませんがオイラは使っていないので、詳しい人の回答をお待ちください（これを Windows 上で使うと呼んでいいのかは微妙な気がする）


CC BY-SA 4.0
2019-10-30T07:30:13.483
60121
2019-10-30T07:30:13.483
8589
60118
answer