質問: Visual Studio 2019を使っております.初心者です. プログラミングに対する知識はそれほどありません. 先日,Visual Studio 2019を使用して,サンプルプログラムを実行したところ, `#include ` `#include ` の所にエラーが出て,termios.hとunistd.hのソースファイルがないとのことだったので,ソリューションエクスプローラー内の外部依存関係にtermios.hとunistd.hを入れ込んだところ,unistd.hは問題なかったのですが,termios.hを開くと, `#error "Never include directry; use instead."` というエラーが出て,困っています. 解決策と可能であれば原因を教えていただけないでしょうか.
回答: **訂正:解決策** @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 の入出力を行うプログラム Windows用:RS232C の入出力を行うプログラム 純粋にWindows系で探すと、こんな記事が出てきます。 古いのばかりなので、今Visual Studio 2019でそのままとはいかないでしょうが、大部分は流用出来るのでは? Serial Port (RS -232) Connection in C++ Serial Communication in Windows Serial Port Sample Serial Communications) Serial Port Programming using Win32 API **原因** おそらくVisual Studio の構成で、「C++ による Linux 開発ワークロード」をインストールせずに、サンプルプロジェクトをコピーし、どこかから間違った`termios.h`を入手したものと思われます。 例えば、gnu のサイトでは無いですが、 以下が該当すると思われる間違ったファイルと、そのエラーメッセージ部分 glibc/sysdeps/unix/sysv/linux/bits/termios.h > > > ``` > #ifndef _TERMIOS_H > # error "Never include directly; use instead." > #endif > > ``` > > 同じサイトの本来インクルードしておくべきと思われるファイル glibc/include/termios.h > > > ``` > #ifndef _TERMIOS_H > #include > > ``` > > glibc/termios/termios.h > > > ``` > #ifndef _TERMIOS_H > #define _TERMIOS_H 1 > > ``` > > Visual Studio 2019 については、以下のページなどから始まるインストールとセットアップの手順にしたがって、開発環境を整えてから、現在試そうとしているサンプルプログラム/プロジェクトを再度ダウンロード・展開して始める方が良いでしょう。 **ただし、ビルドするためだけでも WSL,仮想環境のLinuxVM,Linuxマシン のいずれかが必要です。** Linux ワークロードのダウンロード、インストール、セットアップ Visual Studio でターゲットの Linux システムに接続する 新しい Linux プロジェクトを作成する Linux プロジェクトを構成する Linux CMake プロジェクトの作成と構成 チュートリアル:Visual Studio で C++ クロスプラットフォーム プロジェクトを作成する 例えばWSLなら、こんな記事に概要が出ています。 WSL その82 - Ubuntuからシリアルデバイス(COMポート)にアクセス可能に 英語版の元情報記事 Serial Support on the Windows Subsystem for Linux 小型ボードコンピュータのLinuxなら、こんな構成/プログラム例があります。 シリアル通信プログラム概説 **補足** 今扱っているサンプルプログラムをなるべく変更せずにWindows/Unix両方で扱いたい場合は、困難な道になりますが、以下の様な両環境の互換性向上を狙ったライブラリを利用する手段もあります。 どこまでの機能がサポートされているかは不明ですが、`termios`互換ライブラリを作った先人の仕事が公開されているようです。 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)? Full getopt Port for Unicode and Multibyte Microsoft Visual C, C++, or MFC Projects 上記で何とか出来ず問題が発生した場合は、自分で何とかする、という以下の英語記事が参考になりそうですが、上記以上に非常に困難な道でしょう。 What is the Windows equivalent to the capabilities defined in sys/select.h and termios.h