VSCode搭建C/C++开发环境
VSCode简介
官网:https://code.visualstudio.com/
Code editing.Redefined;Free. Built on open source. Runs everywhere.
VSCode的曲线救国
- 前身 Monaco Editor(web 编辑器)2011
- 把Monaco Editor套在Electron(Chromium + Node.js)里面,就有了跨平台的桌面VSCode 2015
- 远程开发,Github Codespaces,vscode.dev 2017~
视频:Keynote by Erich Gamma: VS Code an Overnight Success… 10 years in the making
VSCode定位
特性:
- VSCode只是个前端
- 定标准协议Language Server Protocol,Debug Adapter Protocol
- 把功能实现插件化
编译器
https://code.visualstudio.com/docs/languages/cpp#_tutorials
VSCode不带编译器,不同的平台安装自己的编译器
- GCC on Windows via MinGW
- Microsoft C++ on Windows
- GCC on Linux
- GCC on Windows Subsystem For Linux
- Clang/LLVM on macOS
语言服务LSP
Language Server Protocol:https://microsoft.github.io/language-server-protocol/
IDE的特性:
- autocomplete自动补全
- goto definition转跳
- documentation on hover光标放在代码上,显示文档
- find all references查找引用
- etc
如何工作的:
软件设计原则-依赖倒置原则
高层不应该依赖低层,要依赖于抽象,不要依赖于具体实现(面向接口编程)
C、CPP语言服务列表:
https://microsoft.github.io/language-server-protocol/implementors/servers/
Language | Maintainer | Repository | Implementation Language |
---|---|---|---|
C++ | MS | VS Code C++ extension | C++ |
C++/clang | LLVM Project | clangd | C++ |
C/C++/Objective-C | Jacob Dufault, MaskRay, topisani | cquery(Archived) | C++ |
C/C++/Objective-C | MaskRay | ccls(originates from cquery,on Apr 7, 2021) | C++ |
参考其它C、C++的IDE:
- Qt Creator 7:将默认的后端切换到Clangd。https://www.qt.io/blog/qt-creator-7-released
- Clion(Jetbrain):默认用Clangd。https://www.jetbrains.com/help/clion/c-support.html
实现C、CPP语言服务面临的问题
- 没有统一的包管理器:vcpkg,conan
- 构建系统build system碎片化:VS(xml配置),QT(qmake-->CMake),Clion(CMake)
- 要去处理不同的构建系统:项目有哪些源代码?包含了哪些头文件?依赖于哪些三方库?有哪些编译Flags?
Note:后面内容基于CMake来讲
Clangd语言服务
文档:https://clangd.llvm.org/installation#project-setup
Note:VSCode的clangd插件和clangd是两个东西,虽然clangd插件才
v0.1.15
版本;clangd已经到13、14版本了
下载clangd:
- 通过VSCode的clangd插件命令:
>clangd: Download language server
- 自行下载clangd,然后配置到
path
目录下
配置:
clangd如何知道我编译了哪些代码?include了哪些头文件,依赖于哪些库?有些哪些编译flags?
compile_commands.json
配置文件:该文件为项目中的每个源文件提供编译命令
如何生成:
- 命令:
cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
- CMakeLists.txt文件:
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
一般把这个文件生成到build目录,clangd就能找到
Note:切换分支或是大量代码变更会导致clangd提示出问题,需要重新编译生成
compile_commands.json
配置文件;重启下clangd:>clangd: Restart language server
CMake
文档:https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/README.md
CMake Tools插件:https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
常用命令:
- 初始化项目:
>CMake: quick Start
- Kit编译器命令:设置编译器
- 编辑本地的编译器配置:
>CMake: Edit User-Local CMake Kits
- 搜索电脑的编译器:
>CMake: Scan for Kits
- 选择哪个编译器:
>CMake: Select a Kit
- 编辑本地的编译器配置:
- 设置编译的类型:
>CMake: Select Variant
,设置CMake的CMAKE_BUILD_TYPE变量 - 配置:
>CMake: Configure
;执行cmake -S . -B build
命令 - 编译:
>CMake: Build
;执行cmake --build build
命令 - 清理缓存重新配置:
>CMake: Delete Cache and Reconfigure
- 编辑CMake缓存文件:
${project_root}/build/CMakeCache.txt
>CMake: Edit CMake Cache
>CMake: Edit CMake Cache (UI)
Debug调试DAP
命令行调试程序:
步骤:
- 编译出带有Debug信息的程序;
- 用GDB或LLDB去调试程序
LLDB教程:https://lldb.llvm.org/use/tutorial.html
todo
本质上是GDB和LLDB程序去调试代码,VSCode只是个前端
- MS的C++插件:已经包含了GDB功能
- LLVM的CodeLLDB 推荐
配置:
文件:.vscode/launch.json
调试程序的前提:编译出来的程序带有debug信息;比如加-g
选项
$ gdb a.out
$ lldb a.out
调试操作:
- Continue / Pause 继续/暂停(F5)
- Step Over单步执行(F10)
- Step Into进入函数(F11)
- Step Out退出函数(⇧F11)
- Restart重新调试(⇧⌘F5)
- Stop停止调试(⇧F5)
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
int random_range(int min_num, int max_num) {
if (min_num > max_num) {
exit(EXIT_FAILURE);
}
int ret = 1 + rand() % (max_num - min_num) + min_num;
return ret;
}
int main(int argc, char* argv[]) {
int* nil = NULL;
srand(time(NULL));
int ret = 0;
for (int i = 0; i < 200; i++) {
ret = random_range(0, 20);
printf("ret = %d\n", ret);
if (ret == 13) {
printf("boom!\n");
memcpy(nil, &ret, sizeof(nil)); // segmentation fault
}
usleep(10000);
}
return 0;
}
其他功能:
- Watch:监控
- Call stack:函数调用栈
- Debug console:用来输入命令
条件断点:Conditional breakpoints
- 条件表达式Expression condition:表达式成立的时候会断点
- 执行次数Hit count:执行了多少次才会断点
代码格式化
如何实现格式化?
https://code.visualstudio.com/docs/cpp/cpp-ide#_code-formatting
Clang-format:https://clang.llvm.org/docs/ClangFormat.html
MS和LLVM的格式化都是使用的clang-format
- MS的C/C++插件:是把clang-format程序下载到本地电脑
- LLVM的clangd插件:集成到了语言服务程序clangd里面
- 本质上都是调用了类似于
clang-format -i ${file_name}
这样的命令:写个脚本格式代整个项目
.clang-format
配置文件
Clangd找配置文件的顺序:
- 先去同级目录找:
./.clang-format
(使用三方库,有的库会自带) - 去父级目录找 --> 项目根目录找:
${project_root}/.clang-format
(自己项目开发需要) - 去用户根目录下找:
~/.clang-format
(自己写代码方便,不用每次去copy一份到项目里面来)
$ clang-format -style=llvm -dump-config > .clang-format
选项详细文档:https://clang.llvm.org/docs/ClangFormatStyleOptions.html
Note:配置在使用的时候可能会遇到选项兼容性的问题;clang-format新版本会更新增加选项,如果新版本的.clang-format给到老版本的qt creator使用可能会遇到兼容性的问题;需要升级clang-format,qt creator使用新版本的clang-format
静态分析
Clang-tidy:https://clang.llvm.org/extra/clang-tidy/
Addresssanitizer
https://github.com/google/sanitizers/wiki/AddressSanitizer
- Use after free (dangling pointer dereference)
- Heap buffer overflow
- Stack buffer overflow
- Global buffer overflow
- Use after return
- Use after scope
- Initialization order bugs
- Memory leaks
常用插件
相关插件安装
Note: 下面格式
C/C++ / ms-vscode.cpptools
,用/
分隔,左边是插件名,右边是插件ID;用插件ID在VSCode搜索更加准确
推荐插件安装列表:
- c/c++语言服务插件: (新手【不懂lsp的】不要乱装其他相关的c/c++插件,下面二者开启一个即可;如果同时开启,LLVM会把Macrosoft的禁用掉)
- LLVM:clangd/llvm-vs-code-extensions.vscode-clangd (LInux平台推荐)
- Macrosoft:C/C++ / ms-vscode.cpptools (Windows平台推荐)
- Debug插件:CodeLLDB/vadimcn.vscode-lldb
- cmake语法插件:CMake/twxs.cmake
- cmake tools插件:CMake Tools/ms-vscode.cmake-tools
- 一键运行单个文件插件:Code Runner/formulahendry.code-runner
- 自动生成注释结构:Doxygen Documentation Generator/cschlosser.doxdocgen
- git增强插件:GitLens — Git supercharged/eamodio.gitlens
- git ignore插件:gitignore/codezombiech.gitignore
- 错误增强显示插件:Error Lens/usernamehw.errorlens
- 图标增强:vscode-icons/vscode-icons-team.vscode-icons
命令一次性安装:
$ code --install-extension