vscode使用compile_commands.json
背景
vscode+cmake可以實現C/C++項目開發和構建。可以在vscode上裝以下幾個插件:
CMake Tools插件
能夠給C/C++插件
提供信息,實現IntelliSense、代碼補全、注釋瀏覽、文件轉跳等功能。一般在第一次使用CMake Tools插件
時會出現如下提示:
Allow之后會在當前工作目錄的.vscode/settings.json
文件(即當前工作目錄的設置文件,會覆蓋用戶設置文件)中添加:
{
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
}
當然,也可以在C/C++插件
的配置文件.vscode/c_cpp_properties.json
中手動指定configurationProvider
:
{
"configurations": [
{
"name": "Linux",
"includePath": [],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "gnu++14",
"intelliSenseMode": "gcc-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
這樣C/C++插件
就能正常工作了,不用自己指定.vscode/c_cpp_properties.json
的includePath
和defines
。
除了以上兩種方式以外,還有另一種方式:
指定compile_commands.json
- 讓cmake生成
compile_commands.json
,需要在運行cmake
時添加參數-DCMAKE_EXPORT_COMPILE_COMMANDS=True
或者在CMakeLists.txt中添加set(CMAKE_EXPORT_COMPILE_COMMANDS True)
。例子:假設在~
目錄下有一個hello的項目
cd ~/hello
mkdir build
cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=True ..
會在~/hello/build
下生成compile_commands.json
。
- 在vscode中打開
~/hello
目錄,配置.vscode/c_cpp_properties.json
。指定compileCommands
為上一步的~/hello/build/compile_commands.json
:
{
"configurations": [
{
"name": "Linux",
"includePath": [],
"defines": [],
"compilerPath": "/usr/bin/g++",
"cStandard": "gnu11",
"cppStandard": "gnu++14",
"intelliSenseMode": "gcc-x64",
"compileCommands": "~/hello/build/compile_commands.json"
}
],
"version": 4
}
這樣和指定configurationProvider
是一樣的效果。
原理
configurationProvider
:
The ID of a VS Code extension that can provide IntelliSense configuration information for source files. For example, use the VS Code extension ID ms-vscode.cmake-tools to provide configuration information from the CMake Tools extension.
compileCommands
:
The full path to the compile_commands.json file for the workspace. The include paths and defines discovered in this file will be used instead of the values set for includePath and defines settings. If the compile commands database does not contain an entry for the translation unit that corresponds to the file you opened in the editor, then a warning message will appear and the extension will use the includePath and defines settings instead.
參考:
https://cmake.org/cmake/help/latest/variable/CMAKE_EXPORT_COMPILE_COMMANDS.html
https://code.visualstudio.com/docs/languages/cpp
https://code.visualstudio.com/docs/cpp/cmake-linux
https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference
https://code.visualstudio.com/docs/cpp/customize-default-settings-cpp
https://code.visualstudio.com/docs/cpp/configure-intellisense-crosscompilation
https://clang.llvm.org/docs/JSONCompilationDatabase.html