2022年7月10日日曜日

VSCodeのcpp開発時にincludePathやdefinesを設定してエラーを解消する



背景

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.13
ubuntu22.04でiostreamをincludeできなかった場合の設定を追記しました。

2023.12.31
iostreamを認識するためのjsonの設定の括弧に不足している部分があったので修正しました

0 件のコメント :