Skip to content
Published at:

VSCode搭建C/C++开发环境

VSCode简介

官网:https://code.visualstudio.com/

Code editing.Redefined;Free. Built on open source. Runs everywhere.

VSCode的曲线救国

  1. 前身 Monaco Editor(web 编辑器)2011
  2. 把Monaco Editor套在Electron(Chromium + Node.js)里面,就有了跨平台的桌面VSCode 2015
  3. 远程开发Github Codespacesvscode.dev 2017~

视频:Keynote by Erich Gamma: VS Code an Overnight Success… 10 years in the making

VSCode定位

特性:

编译器

https://code.visualstudio.com/docs/languages/cpp#_tutorials

VSCode不带编译器,不同的平台安装自己的编译器

语言服务LSP

Language Server Protocolhttps://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/

LanguageMaintainerRepositoryImplementation Language
C++MSVS Code C++ extensionC++
C++/clangLLVM ProjectclangdC++
C/C++/Objective-CJacob Dufault, MaskRay, topisanicquery(Archived)C++
C/C++/Objective-CMaskRayccls(originates from cqueryon Apr 7, 2021C++

参考其它C、C++的IDE:

实现C、CPP语言服务面临的问题

  • 没有统一的包管理器:vcpkgconan
  • 构建系统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

命令行调试程序:

步骤:

  1. 编译出带有Debug信息的程序;
  2. 用GDB或LLDB去调试程序

LLDB教程:https://lldb.llvm.org/use/tutorial.html

todo

本质上是GDB和LLDB程序去调试代码,VSCode只是个前端

  • MS的C++插件:已经包含了GDB功能
  • LLVM的CodeLLDB 推荐

配置:

文件:.vscode/launch.json

调试程序的前提:编译出来的程序带有debug信息;比如加-g选项

bash
$ gdb a.out
$ lldb a.out

调试操作:

  • Continue / Pause 继续/暂停(F5)
  • Step Over单步执行(F10)
  • Step Into进入函数(F11)
  • Step Out退出函数(⇧F11)
  • Restart重新调试(⇧⌘F5)
  • Stop停止调试(⇧F5)

示例:

c
#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找配置文件的顺序:

  1. 先去同级目录找:./.clang-format (使用三方库,有的库会自带)
  2. 去父级目录找 --> 项目根目录找:${project_root}/.clang-format(自己项目开发需要)
  3. 去用户根目录下找:~/.clang-format(自己写代码方便,不用每次去copy一份到项目里面来)
bash
$ 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

常用插件

相关插件安装

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

Updated at: