问题:
gcc/g++是c/c++使用最广泛的编译器,也是linux默认自带的编译套件,但在vscode上,也可通过微软官方提供的C/C++插件很便捷进行c/c++代码编译调试,但是该插件的自动补全和代码提示等功能很差,经常给不出合理的候选项。
另外一套C/C++代码编译套件是基于LLVM的clang/clang++编译器、lldb调试器、clangd语言服务器,使用clangd来实现高效的静态检查、自动补全和代码提示。
硬件环境: VScode SSH远程连接Linux x86服务器
-
安装必要软件依赖
apt install clang clangd lldb cmake
clang:Clang是一种用于C、C++和Objective-C编程语言的编译器前端。它被设计为一个快速、高效和高度可定制的编译器,提供出色的诊断和错误信息。Clang是LLVM项目的一部分,LLVM是一个模块化和可重用的编译器和工具链技术集合。
clangd:clangd是一个基于Clang编译器的语言服务器,用于提供C/C++语言的代码补全、语义分析和代码导航等功能。clangd通过解析源代码并构建语法树和语义图来理解代码,并根据用户的输入提供相关的代码建议和信息。它还支持跳转到定义、查找引用、重构等功能,帮助开发人员更高效地编写和维护C/C++代码。
lldb:lldb是一个开源的调试器,用于调试C、C++、Objective-C和Swift等编程语言的应用程序。它是在LLVM项目的基础上开发的,和GDB功能类似。
cmake:CMake是一个跨平台的开源构建工具。 -
在vscode上安装需要的依赖:
在安装前卸载之前配置使用gcc调试用的C/C++插件(冲突),然后安装Clangd和CodeLLDB
-
.vscode/settings.json
添加配置:
// 开启粘贴保存自动格式化
"editor.formatOnPaste": true,
"editor.formatOnType": true,
"C_Cpp.errorSquiggles": "Disabled",
"C_Cpp.intelliSenseEngineFallback": "Disabled",
"C_Cpp.intelliSenseEngine": "Disabled",
"clangd.path": "/usr/bin/clangd",
// Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
"clangd.arguments": [
// compile_commands.json 生成文件夹
"--compile-commands-dir=${workspaceFolder}/build",
// 让 Clangd 生成更详细的日志
"--log=verbose",
// 输出的 JSON 文件更美观
"--pretty",
// 全局补全(输入时弹出的建议将会提供 CMakeLists.txt 里配置的所有文件中可能的符号,会自动补充头文件)
"--all-scopes-completion",
// 建议风格:打包(重载函数只会给出一个建议)
// 相反可以设置为detailed
"--completion-style=bundled",
// 跨文件重命名变量
"--cross-file-rename",
// 允许补充头文件
"--header-insertion=iwyu",
// 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
"--header-insertion-decorators",
// 在后台自动分析文件(基于 complie_commands,我们用CMake生成)
"--background-index",
// 启用 Clang-Tidy 以提供「静态检查」
"--clang-tidy",
// Clang-Tidy 静态检查的参数,指出按照哪些规则进行静态检查,详情见「与按照官方文档配置好的 VSCode 相比拥有的优势」
// 参数后部分的*表示通配符
// 在参数前加入-,如-modernize-use-trailing-return-type,将会禁用某一规则
"--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",
// 默认格式化风格: 谷歌开源项目代码指南
// "--fallback-style=file",
// 同时开启的任务数量
"-j=2",
// pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能) 推荐在板子上使用disk
"--pch-storage=disk",
// 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末
// 我选择禁用
"--function-arg-placeholders=false",
// compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
"--compile-commands-dir=build"
],
注意compile-commands-dir项为编译目录,会在这下面生成clangd静态检查依赖编译数据库文件compelie_commands.json
4. cmake构建添加参数:
cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .. -G 'Unix Makefiles'
等价于在CMake文件中添加定义set(CMAKE_EXPORT_COMPILE_COMMANDS, 1)
之后,写代码就会自动提示,静态检查也会显示在vscode Problem窗口中;
此外,调试器设置(launch.json)可用clang++、也可用g++。
TIPS:
在Top CMakeLists.txt中设置c\c++编译器时,写在project()之前才会生效,不然还是会找系统默认的编译器,如下:
cmake_minimum_required(VERSION 3.10.1)
# SET(CMAKE_C_COMPILER "/opt/envs/gcc-9.4.0/bin/gcc")
# SET(CMAKE_CXX_COMPILER "/opt/envs/gcc-9.4.0/bin/g++")
set(CMAKE_C_COMPILER "/usr/bin/clang")
set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
project(infersdk) # 在这行之前设置CMAKE_CXX_COMPILER
标签:clangd,VSCode,代码,clang,--,编译器,C++
From: https://www.cnblogs.com/lee-zq/p/17779315.html