背景
PC向けにビルドするcppのプログラムを見る機会がありVSCodeで開いたところ、Makefileでパスを指定するライブラリを読み込む部分がエラーとして赤線が表示される状況に遭遇しました。makeは出来るので記述は問題ないのですが、赤線が引かれたままだと他の不具合を見落とす可能性があるので、設定を書いてエラーを解消しました。
備忘録を兼ねて取り組んだ内容を共有します。
使ったもの
- Ubuntu20.04をインストールしたPC
- VSCode
- VSCodeのcとc++のプラグイン
Microsoftが提供する下記のものを利用しました。 - cppのプロジェクト
PS5のコントローラーとUSBやbluetooth経由で連携するためのdualsensectlというプログラムをエラー無くビルドするための設定をこの記事では紹介します。
https://github.com/nowrep/dualsensectl
対応方法: .vscode/c_cpp_properties.jsonを作って設定を記述する
プロジェクトの.vscodeディレクトリにc_cpp_properties.jsonを作り、そこにエラーを解消する設定を記述します。.vscodeディレクトリとsettings.jsonはcppのプラグインによって自動で作られると思いますが、c_cpp_properties.jsonは作られないので手動で作ってください。
遭遇したエラーとそれを解消するための記述を紹介します。
includeでエラーになる: includePathを設定
dbus.hをinclude出来ないエラーが表示されました。これはmake実行時はMakefileのパス指定処理が動くのでエラーになりませんが、VSCodeは分からないためエラーになっています。
CFLAGS += $(shell pkg-config --cflags dbus-1)
dbus-1は自分のPCだと下記のパスでした。
pkg-config --cflags dbus-1
-I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include
ということで、上記のパスを.vscode/c_cpp_properties.jsonに設定します。
自分が把握しているincludePathの書き方は2種類です。
どちらの方法でもエラーは解消します。
configurationのincludePathとして記述する場合
.vscode/c_cpp_properties.json
{
"configurations": [
{
"includePath": [
"/usr/include/dbus-1.0",
"/usr/lib/x86_64-linux-gnu/dbus-1.0/include",
]
}
]
}
configurationのcompilerArgsの-Iオプションで指定する場合
.vscode/c_cpp_properties.json
{
"configurations": [
{
"compilerArgs": [
"-I/usr/include/dbus-1.0",
"-I/usr/lib/x86_64-linux-gnu/dbus-1.0/include"
]
}
]
}
VSCodeがパスを認識してdbusのincludeのエラーが無くなりました。
ビルド時に指定する定数が無くてエラーになる: definesを設定
識別子の未定義に関するエラーが発生しました。対象の識別子はmake実行時はMakefileで指定される定数です。
VERSION = 0.2
DEFINES += -DDUALSENSECTL_VERSION=\"$(VERSION)\"
ということで、変数を.vscode/c_cpp_configuration.jsonで指定します。
把握している記述方法は2種類あり、どちらの方法でもエラーは解消します。
configurationのdefinesとして記述する
.vscode/c_cpp_properties.json
{
"configurations": [
{
"defines": [
"DUALSENSECTL_VERSION=\"0.2\""
]
}
]
}
configurationのcompilerArgsの-Dオプションで指定する
.vscode/c_cpp_properties.json
{
"configurations": [
{
"compilerArgs": [
"-DDUALSENSECTL_VERSION=\"0.2\"",
]
}
]
}
VSCodeがパスを認識してdbusのincludeのエラーが無くなりました。
終わり
自分のPCのVSCodeに下記のc_cpp_properties.jsonを追加すればdualsensectlをエラー無く開けると分かりました。.vscode/c_cpp_properties.json
{
"configurations": [
{
"defines": [
"DUALSENSECTL_VERSION=\"0.2\""
],
"includePath": [
"/usr/include/dbus-1.0",
"/usr/lib/x86_64-linux-gnu/dbus-1.0/include"
]
}
]
}
追加情報: ubuntuでiostreamをincludeする場合
ubuntu22.04でiostreamを使うcppファイルを書いたところincludeでエラーが発生しました。(しかし、ビルドと実行はできました。)自分の環境では下記の設定でエラーが解消しました。
.vscode/c_cpp_properties.json
{
"configurations": [
{
"includePath": [
"/usr/include/c++/11/",
"/usr/include/x86_64-linux-gnu/c++/11/"
]
}
]
}
VSCodeへのc++プラグインのインストールで直る場合もあるようですが、自分の環境では標準ライブラリをvscodeで読み込んでくれないため手動で設定が必要でした。
発生したエラー
#include エラーが検出されました。includePath を更新してください。この翻訳単位 (main.cpp) では、波線が無効になっています。C/C++(1696)
ソース ファイルを開けません "iostream". システム ヘッダーを見つけるには、'IntelliSense 構成の選択...' コマンドを実行してください。C/C++(1696)
#include エラーが検出されました。includePath を更新してください。この翻訳単位 (main.cpp) では、波線が無効になっています。C/C++(1696)
ソース ファイルを開けません "bits/c++config.h" (dependency of "iostream")C/C++(1696)
パスの探索に使ったコマンド
find /usr/include/ -type f -name iostream
find /usr/include/ -type f -name c++config.h
参考
VS codeのinclude pathの設定をちゃんとするc_cpp_properties.json reference
Insights #include errors detected ... cannot open source file "iostream #1041
Missing include "bits/c++config.h" when cross compiling 64 bit program on 32 bit in Ubuntu
変更履歴
2023.11.13ubuntu22.04でiostreamをincludeできなかった場合の設定を追記しました。
2023.12.31
iostreamを認識するためのjsonの設定の括弧に不足している部分があったので修正しました
0 件のコメント :
コメントを投稿