VS Code CMake 工程中 C++ 提示不正常

如果用 Intellisense

以文件 .vscode/c_cpp_properties.jsonconfigurationconfigurationProvider 的值来分类。

ms-vscode.cmake-tools

缺点:文件不在编译数据库中时 include 路径不正确(对新文件不友好)

configurationProviderms-vscode.cmake-toolscompileCommandsincludePath 设置是无效的。这个时候如果 compile_commands.json (编译数据库)中没有这个文件(尤其是 CMakeLists.txt 中可能尚未加入新编写的文件的情况),或者编译数据库尚未配置(需要先编译生成一次),include 路径就不正确。

[10/26/2023, 7:45:25 PM] "xxxx.cc" not found in "${workspaceFolder}/build/compile_commands.json". 'includePath' from c_cpp_properties.json in folder 'proj' will be used for this file instead.s

这段话的意思:由于文件(是新创建的,所以暂时)并不在 compile_commands.json 中,不会给文件应用和工程相同的 include 路径,而且怎么加都没有用!

ms-vscode.cpp-tools 或者未配置

缺点:文件不在编译数据库中时 include 路径采用 includePath 的值(对新文件不友好,手工调整 includePath 又很累)+ 对宏的检查不准确。

configurationProviderms-vscode.cpp-tools 或者没有配置时compileCommandsincludePath 设置则是有效的。文件尚不在编译数据库中时会采用 includePath 的设置。只是想要解决找不到 cuda 的问题很简单:

但是这样有一个新的问题:include 需要在 c_cpp_properties.json 和 CMakeLists.txt 中维护两份。所以最好还是直接将文件及时加入到 CMakeLists.txt 中比较好。

另外,使用 ms-vscode.cpp-tools 作为配置提供者时,宏的定义往往不准确,不建议这么做。

如果用 clangd

缺点:对 cuda 支持不好 + 比 intellisense 的搜索更加死板,暂时不支持 Doxygen。

Unsupported option '--generate-code=arch=compute_61,code [compute_61,sm_61]'clang(drv_unsupported_opt)

解决方案是给 .clangd 文件(可以本地,也可以全局)加上:

#CompileFlags:
#  Add:
#    - --cuda-path=/usr/local/cuda/ # 如果为空会自动检测
#    - -L/usr/local/cuda-11.7/targets/x86_64-linux/lib/
#    - -I/usr/local/cuda-11.7/targets/x86_64-linux/include/

CompileFlags:
  Add:
    - -std=gnu++17
    - -L/usr/local/cuda-11.7/targets/x86_64-linux/lib/
    - -I/usr/local/cuda-11.7/targets/x86_64-linux/include/
  Remove:
    - -forward-unknown-to-host-compiler
    - --generate-code*
    - --expt-relaxed-constexpr

另外,.gitignore 里面要加上 .cache。

好处是即便文件不在 CMakeLists.txt 中,clangd 也能对文件提供一定的查找功能。