VS Code CMake 工程中 C++ 提示不正常
如果用 Intellisense
以文件 .vscode/c_cpp_properties.json
中 configuration
的 configurationProvider
的值来分类。
ms-vscode.cmake-tools
缺点:文件不在编译数据库中时 include 路径不正确(对新文件不友好)。
configurationProvider
是 ms-vscode.cmake-tools
时,compileCommands
和 includePath
设置是无效的。这个时候如果 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
又很累)+ 对宏的检查不准确。
configurationProvider
是 ms-vscode.cpp-tools
或者没有配置时,compileCommands
和 includePath
设置则是有效的。文件尚不在编译数据库中时会采用 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 也能对文件提供一定的查找功能。