クロスコンパイルのためのIntelliSense
この記事では、開発ホストマシンとは異なるアーキテクチャ用にコンパイルする場合に、Visual Studio Codeで適切なIntelliSense(コード補完など)を提供できるようにC/C++拡張機能を構成する方法について説明します。たとえば、ホストマシンがx64で、Arm用にコンパイルする場合などです。
C/C++拡張機能はコンパイラではありません。構文ハイライトやIntelliSenseなどの豊富な言語機能を提供します。拡張機能が正しいIntelliSenseの提案を提供し、データ型の正しいサイズを反映するためには、C++拡張機能がターゲットアーキテクチャをエミュレートするように構成する必要があります。
これらの構成設定は、プロジェクトのc_cpp_properties.jsonファイルに保存されます。このファイルを編集するには、VS Codeでコマンドパレット(⇧⌘P (Windows, Linux Ctrl+Shift+P))からC/C++: 構成の編集 (UI)を選択します。

IntelliSense構成の例
以下は、Linux x64ホストマシンがLinux Armをターゲットとする場合のC/C++拡張機能の構成例です。以下のIntelliSense設定を構成します。
- コンパイラパス: 拡張機能は、この場所にあるコンパイラに問い合わせて、システムライブラリとコンパイラ定義を取得します。
- IntelliSenseモード: 拡張機能が正しいIntelliSenseを提供し、
pointer、size_t、longなどのデータ型の正しいサイズを反映できるように、ターゲットアーキテクチャとコンパイラをエミュレートします。
最低限、コンパイラパスとIntelliSenseモードを設定することで、拡張機能がプロジェクトのターゲットアーキテクチャをエミュレートするのに十分な情報が提供されます。ただし、コンパイラパスをクエリして返された定義に基づいて拡張機能が正しく選択できる場合、IntelliSenseモードの設定は不要な場合があります。
コンパイラのパス
プロジェクトのビルドに使用しているコンパイラのフルパスに設定します。
例

IntelliSenseモード
使用しているコンパイラのアーキテクチャ固有のバリアントに設定します。
例

インクルードパス
プログラムがワークスペースにないヘッダーファイルや標準ライブラリパスにないヘッダーファイルをインクルードする場合にのみ、インクルードパスを変更する必要があります。
C/C++拡張機能は、コンパイラパスで指定されたコンパイラに問い合わせてインクルードパスを設定します。ターゲットシステムライブラリのパスを拡張機能が見つけられない場合は、インクルードパスを手動で入力できます。

上記の設定を考慮すると、c_cpp_configuration.jsonファイルは以下のようになります。コマンドパレットからC/C++: 構成の編集 (JSON)を選択することで開くことができます。
{
"configurations": [
{
"name": "myConfigurationName",
"includePath": ["${workspaceFolder}/**"],
"defines": [],
"compilerPath": "/usr/bin/arm-none-eabi-g++",
"cStandard": "c11",
"cppStandard": "c++14",
"IntelliSenseMode": "gcc-arm"
}
],
"version": 4
}
次のステップ
- IntelliSense構成の詳細については、「既定の設定のカスタマイズ」を参照してください。
- 設定の構成で問題が発生した場合は、GitHubディスカッションで議論を開始してください。修正が必要な問題が見つかった場合は、GitHub Issuesで問題を報告してください。
- C++ 拡張機能の概要を確認してください。