由于C++在不同平台上编译使用的编译器不同,所以我们先将官网针对不同平台的编译文档摘录出来,以便大家参考:
参考: https://code.visualstudio.com/docs/cpp/config-linux
参考: https://code.visualstudio.com/docs/cpp/config-mingw
参考: https://code.visualstudio.com/docs/cpp/config-wsl
参考: https://code.visualstudio.com/docs/cpp/config-clang-mac
一个很好的参考文档: https://www.zhihu.com/question/30315894/answer/154979413
使用快捷键ctrl+shift+P
打开Command Palette,输入C++
, C/C++: Edit configurations(JSON)
可以生成c_cpp_properties.json
, 并自动进入该文件, 下面是Mac中生成的配置文件:
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"macFrameworkPath": [],
"compilerPath": "/usr/local/bin/gcc-11",
"cStandard": "gnu17",
"cppStandard": "gnu++17",
"intelliSenseMode": "macos-gcc-x64"
}
],
"version": 4
}
先看官网的介绍:https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference
官网的示例配置:
{
"env": {
"myDefaultIncludePath": ["${workspaceFolder}", "${workspaceFolder}/include"],
"myCompilerPath": "/usr/local/bin/gcc-7"
},
"configurations": [
{
"name": "Mac",
"intelliSenseMode": "clang-x64",
"includePath": ["${myDefaultIncludePath}", "/another/path"],
"macFrameworkPath": ["/System/Library/Frameworks"],
"defines": ["FOO", "BAR=100"],
"forcedInclude": ["${workspaceFolder}/include/config.h"],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"compileCommands": "/path/to/compile_commands.json",
"browse": {
"path": ["${workspaceFolder}"],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
],
"version": 4
}
每个字段,官网已经有详细的介绍,我就不再摘录,只是根据自己的理解的介绍一下。
整个配置文件可以分成三大部分:
name
: 我们的配置文件可能有多个,所以每个配置文件都有一个友好的标识,也就是“name”字段,可以帮我们在其他地方选择到底我们需要的是那个配置文件intelliSenseMode
: 告诉VSCode当前配置想要模拟的目标架构和编译器,以便VSCode的C++的插件可以提供正确的IntelliSense,并反映pointer、size_t、long等数据类型的正确大小。通常,不同平台采用不同的值:
compilerPath
: 编译器路径, 在上面的例子中,我们使用了mac里面的clang编译器。 如果你自己的编译器在别的路径下,可以将这个配置改为对应的路径。当VSCode 知道在哪儿可以找到这些文件时候,它可以提供智能补全和跳转定义、导航等功能。compilerArgs
: 【可选】编译器参数, 如果我们编译的时候需要增加参数,可以通过这个字段来进行设置includePath
: 制定需要搜索的头文件路径,注意, 在这些路径上搜索不是递归的。如果想要递归,可以在目录后加上“**”符号,以明确告知VSCode进行递归搜索。
${workspaceFolder}/**
将搜索${workspaceFolder}
以及所有子目录。${workspaceFolder}/
将搜索${workspaceFolder}
目录,不会搜索子目录forcedInclude
: 【可选】在处理源文件中的任何其他字符之前应包含的文件列表。文件按列出的顺序包含。cStandard
: 使用的C标准cppStandard
: 使用的C++标准打开命令面板(Ctrl+Shift+P), 输入“Cmake”, 选择【Cmake: Configure】.
这时候会弹出很多编译器选项,如果在这里面有需要的编译器,选择即可。如果没有,可以点击【[Scan for kits]】。
扫描的结果会存放在~/.local/share/CMakeTools
目录下,通常这个目录下有两个文件:
我们需要关注的是cmake-tools-kits.json
文件,内容类似:
[
{
"name": "Clang 13.0.0 x86_64-apple-darwin21.3.0",
"compilers": {
"C": "/usr/bin/clang",
"CXX": "/usr/bin/clang++"
}
},
{
"name": "Clang 13.1.6 x86_64-apple-darwin21.6.0",
"compilers": {
"C": "/usr/bin/clang",
"CXX": "/usr/bin/clang++"
}
},
{
"name": "GCC 11.3.0 x86_64-apple-darwin21",
"compilers": {
"C": "/usr/local/bin/gcc-11",
"CXX": "/usr/local/bin/g++-11"
}
}
]
这个文件的作用就是: 记录VSCode发现的当前系统中有哪些编译器可供使用。
我测试的是Mac电脑,同时电脑里面安装了GCC,所以显示的结果如上所述。如果你的电脑是Linux或者Windows,那么结果应该不同, 但是结构肯定类似。
如果你想要在X86架构的电脑上编译ARM的二进制文件,肯定会用到交叉编译器,但是交叉编译器的路径通过上面的方式一般不能扫描到,需要人工添加。
微软官方说明: https://code.visualstudio.com/docs/cpp/configure-intellisense-crosscompilation
我自己使用的方法如下, 为了说明配置逻辑,现在假设:
/usr/arch/arm/host/rk_toolchain/
在上一步介绍的cmake-tools-kits.json
文件中, 我们将交叉编译器按照Json格式添加到文件末尾(注意:必须添加到文件末尾), 具体配置如下:
{
"name": "rk_corss_compiler",
"toolchainFile": "/usr/arch/arm/host/rk_toolchain/toolchain.cmake"
}
最后面的toolchain.cmake
文件,通过名称就可以看到是一个工具链的Cmake说明文件,这个文件是我们创建的(文件名称可以随便起,但是后缀最好写为cmake),在下面会有说明。
toolchain.cmake
文件这里有我使用的一个toolchain.cmake
文件,内容如下:
### toolchain.cmake ###
# this is required
# The name of the operating system for which CMake is to build
SET(CMAKE_SYSTEM_NAME Linux)
SET(RK_TOOLCHAIN_ROOT /usr/arch/arm/host/rk_toolchain/)
# specify the cross compiler
SET(CMAKE_C_COMPILER ${RK_TOOLCHAIN_ROOT}/bin/aarch64-linux-gcc)
SET(CMAKE_CXX_COMPILER ${RK_TOOLCHAIN_ROOT}/bin/aarch64-linux-g++)
# where is the target environment
# CMAKE_FIND_ROOT_PATH: This variable is most useful when cross-compiling.
SET(CMAKE_FIND_ROOT_PATH ${RK_TOOLCHAIN_ROOT})
# search for programs in the build host directories (not necessary)
# detail URL: https://cmake.org/cmake/help/latest/variable/CMAKE_FIND_ROOT_PATH_MODE_PROGRAM.html?highlight=cmake_find_root_path_mode_program
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
参考文档: https://code.visualstudio.com/docs/editor/tasks
解决办法:
导入环境变量:
export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
错误信息:
ld: library not found for -lSystem
解决办法:
编译的时候加入:
-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib