在使用vscode开发较大规模的c++项目时,经常遇到跳转缓慢甚至无法跳转,复杂特性无法准确识别。尤其在使用conan2 + CmakeFile 管理项目时,Microsoft C/C++ Extention变得几乎不可用,是开发中非常大的痛点。

在实践中发现,配置好的clangd插件和常用的C/C++插件来开发C++,要丝滑很多。Clangd插件默认是不支持调试功能,如想继续在Vscode使用调试功能,可以保留C/C++插件,Clangd负责读代码,C/C++插件负责调试。

Clangd插件也会有偶发性的卡住,把CPU吃满的问题,概率比较小。


为什么选择 clangd 和 C/C++ 扩展?

  • clangd:专注于代码补全、跳转到定义、语法分析等功能,特别适合大型 C++ 项目。它解析基于 LLVM 的 Clang 编译器,处理复杂的模板、宏、C++ 标准库时非常强大,并且集成了 clang-tidy 静态分析工具,可以帮助你发现潜在的代码问题。
  • C/C++ 扩展:由微软提供,支持 gdblldb 和 MSVC 调试器,能够提供强大的调试功能,包括断点调试、堆栈追踪和变量查看。

通过将这两个工具结合使用,你可以利用 clangd 强大的补全和静态分析功能,同时利用 C/C++ 扩展的调试器进行调试。

下面放一个二者的对比:

功能 Clangd Microsoft C/C++ Extension
代码补全 更准确,特别是复杂 C++ 代码 补全能力较弱,处理复杂代码时不够智能
语法分析 基于 Clang 编译器,标准支持全面 支持相对简单,处理 C++ 特性时较为滞后
调试功能 不支持调试 支持丰富的调试功能,适合跨平台开发
性能 处理大项目性能优越,快速响应 大型项目中性能稍显迟缓
易用性 需要 compile_commands.json,配置复杂 简单配置,适合初学者
跨平台支持 各平台表现一致,特别是 Linux、macOS Windows 上支持更佳,跨平台调试能力强
开源社区 开源,活跃社区,快速支持新标准 官方插件,更新较慢

第一步:安装必要的扩展

  1. 安装 clangd 扩展:

    • 在 VSCode 中,进入扩展市场,搜索 clangd,然后点击安装。

    • 或者使用命令行安装:

      code --install-extension llvm-vs-code-extensions.vscode-clangd
      
      
  2. 安装 C/C++ 扩展:

    • 搜索 C/C++(Microsoft 提供的扩展),点击安装。

    • 或者使用命令行:

      code --install-extension ms-vscode.cpptools
      
      

第二步:配置 clangd 用于代码补全

compile_commands.json 是clangd能够进行语法树解析的核心。如何在编译的时候同时生成compile_commands.json文件。

示例 CMakeLists.txt

以下是一个典型的 CMakeLists.txt 文件的示例,展示了如何配置 CMAKE_EXPORT_COMPILE_COMMANDS 生成 compile_commands.json: 添加配置行:

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

cmake_minimum_required(VERSION 3.20)

project(MyProject)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)

# 导出 compile_commands.json 文件
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 如果是 macOS 系统,设置架构为 arm64
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    set(CMAKE_OSX_ARCHITECTURES "arm64")
endif()

# 创建 bin 目录(如果不存在)
file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

# 设置可执行文件输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

# 包含 Conan 的配置
include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)

# 添加子项目
add_subdirectory(proto)
add_subdirectory(client)
add_subdirectory(server)
add_subdirectory(merry_grpc)

编译并生成 compile_commands.json

  1. 运行以下命令来生成 compile_commands.json

    cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
    
    
  2. 生成的 compile_commands.json 文件通常会放置在构建目录下(例如 build/compile_commands.json)。你需要将它复制到项目的根目录,或者将路径指定到 clangd 可以识别的地方。

配置 VSCode 使用 compile_commands.json

确保 compile_commands.json 文件存在于项目根目录后,clangd 会自动识别并使用它。无需其他额外配置,clangd 就能够解析项目的编译信息,从而提供精准的代码补全、符号跳转和语法检查。

补充: 在某些场景下生成的compile_commands.json不是在project_root下面,而是在类似build之类的目录下面。 那么需要在 .vscode/settings.json 增加下面的配置。

{
    "clangd.arguments": [
        "--compile-commands-dir=${workspaceFolder}/build"
    ]
}

其他配置

如果你想要自定义 clangd 的行为,可以在 VSCode 中的 settings.json 文件中进行配置。例如:

{
  "clangd.arguments": [
    "--background-index",  // 开启后台索引
    "--clang-tidy",        // 启用 clang-tidy 静态分析
    "--completion-style=detailed" // 更详细的补全信息
  ]
}


第三步:禁用 C/C++ 扩展的 IntelliSense

clangd 和微软的 C/C++ 扩展都提供代码补全功能,为了避免冲突,建议禁用 C/C++ 扩展的 IntelliSense,使 clangd 完全接管代码补全和语法检查。

  1. 打开 VSCode 设置(Ctrl + ,),搜索 C_Cpp.intelliSenseEngine
  2. C_Cpp.intelliSenseEngine 设置为 Disabled

或者,在项目的 .vscode/settings.json 文件中添加以下配置:

{
  "C_Cpp.intelliSenseEngine": "Disabled"
}


第四步:配置 C/C++ 扩展用于调试

尽管禁用了 C/C++ 扩展的 IntelliSense,我们仍然可以使用它的调试功能。VSCode 支持多种调试器,如 gdblldb 和 MSVC,以下是如何配置调试环境的步骤。

生成 launch.json 文件

按下 F5 键启动调试时,VSCode 会提示生成 launch.json 文件。这个文件定义了如何启动调试器。

以下是一个典型的 launch.json 文件示例,展示了如何使用 gdb 调试:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C++ Debug",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/bin/your_executable",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "miDebuggerPath": "/usr/bin/gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "build",  // 运行编译任务(可选)
      "logging": {
        "engineLogging": true
      }
    }
  ]
}

根据系统和调试器不同,你可以选择使用 gdblldb 或 MSVC 调试器。


第五步:高效使用 clangd 和 C/C++ 扩展

  1. 代码补全和跳转: 使用 clangd 提供的精确代码补全和符号跳转功能,尤其是在大型项目中,clangd 的全局索引功能能够帮助你快速查找代码中的定义和引用。
  2. 静态分析和格式化: clangd 集成了 clang-tidy,能够自动检查代码中的潜在问题。通过配置 clang-format,你还可以保持代码风格的一致性。
  3. 调试: 使用 C/C++ 扩展的调试器可以方便地设置断点、查看变量和堆栈信息,支持实时调试。

总结

通过结合使用 clangd 和微软 C/C++ 扩展,你可以在 VSCode 中丝滑地开发大型 C++ 项目。clangd 提供了高效的代码补全和静态分析功能,而 C/C++ 扩展则提供了强大的调试器。正确的配置可以避免功能冲突,实现高效的开发和调试流程。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐