vscode clangd 保姆教程
以ubuntu 22.04系统为例。
基础依赖
bash
# ubuntu soft
sudo apt install clangd
# 手动安装 vscode
# vscode plugin
名称: clangd
ID: llvm-vs-code-extensions.vscode-clangd
VS Marketplace 链接: https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd
项目配置
bash
# 项目目录必须结构
├── .clangd
├── .clang-format
├── CMakeLists.txt
├── .vscode
│ └── settings.json
└── main.cpp
文件 CMakeLists.txt
:
cmake
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 输出 clangd需要的 compile_commands.json
文件 .vscode/settings.json
:(ros相关路径不需要的可以删除)
json
{
"C_Cpp.intelliSenseEngine": "disabled",
"C_Cpp.default.compilerArgs": [
"--std=c++17"
],
// sudo apt install clangd
"clangd.fallbackFlags": [
"-std=c++17", // 指定C++标准
"-I${workspaceFolder}/src", // 项目源文件目录
"-I${workspaceFolder}/include",
//"-I/usr/include",
//"-I/usr/include/linux",
//"-I/usr/include/c++/11",
//"-I/usr/include/x86_64-linux-gnu",
//"-I/usr/include/x86_64-linux-gnu/11",
"-I/opt/ros/humble/include/actionlib_msgs",
"-I/opt/ros/humble/include/action_msgs",
"-I/opt/ros/humble/include/action_tutorials_interfaces",
"-I/opt/ros/humble/include/ament_index_cpp",
"-I/opt/ros/humble/include/angles",
"-I/opt/ros/humble/include/builtin_interfaces",
"-I/opt/ros/humble/include/class_loader",
"-I/opt/ros/humble/include/composition_interfaces",
"-I/opt/ros/humble/include/cv_bridge",
"-I/opt/ros/humble/include/depthimage_to_laserscan",
"-I/opt/ros/humble/include/diagnostic_msgs",
"-I/opt/ros/humble/include/example_interfaces",
"-I/opt/ros/humble/include/fastcdr",
"-I/opt/ros/humble/include/fastrtps",
"-I/opt/ros/humble/include/foonathan_memory",
"-I/opt/ros/humble/include/geometry_msgs",
"-I/opt/ros/humble/include/image_geometry",
"-I/opt/ros/humble/include/image_tools",
"-I/opt/ros/humble/include/image_transport",
"-I/opt/ros/humble/include/interactive_markers",
"-I/opt/ros/humble/include/intra_process_demo",
"-I/opt/ros/humble/include/joy",
"-I/opt/ros/humble/include/kdl_parser",
"-I/opt/ros/humble/include/keyboard_handler",
"-I/opt/ros/humble/include/laser_geometry",
"-I/opt/ros/humble/include/libstatistics_collector",
"-I/opt/ros/humble/include/libyaml_vendor",
"-I/opt/ros/humble/include/lifecycle_msgs",
"-I/opt/ros/humble/include/logging_demo",
"-I/opt/ros/humble/include/map_msgs",
"-I/opt/ros/humble/include/message_filters",
"-I/opt/ros/humble/include/moodycamel",
"-I/opt/ros/humble/include/nav_msgs",
"-I/opt/ros/humble/include/pcl_conversions",
"-I/opt/ros/humble/include/pcl_msgs",
"-I/opt/ros/humble/include/pendulum_msgs",
"-I/opt/ros/humble/include/pluginlib",
"-I/opt/ros/humble/include/qt_gui_cpp",
"-I/opt/ros/humble/include/rcl",
"-I/opt/ros/humble/include/rcl_action",
"-I/opt/ros/humble/include/rclcpp",
"-I/opt/ros/humble/include/rclcpp_action",
"-I/opt/ros/humble/include/rclcpp_components",
"-I/opt/ros/humble/include/rclcpp_lifecycle",
"-I/opt/ros/humble/include/rcl_interfaces",
"-I/opt/ros/humble/include/rcl_lifecycle",
"-I/opt/ros/humble/include/rcl_logging_interface",
"-I/opt/ros/humble/include/rcl_yaml_param_parser",
"-I/opt/ros/humble/include/rcpputils",
"-I/opt/ros/humble/include/rcutils",
"-I/opt/ros/humble/include/resource_retriever",
"-I/opt/ros/humble/include/rmw",
"-I/opt/ros/humble/include/rmw_dds_common",
"-I/opt/ros/humble/include/rmw_fastrtps_cpp",
"-I/opt/ros/humble/include/rmw_fastrtps_shared_cpp",
"-I/opt/ros/humble/include/robot_state_publisher",
"-I/opt/ros/humble/include/rosbag2_compression",
"-I/opt/ros/humble/include/rosbag2_compression_zstd",
"-I/opt/ros/humble/include/rosbag2_cpp",
"-I/opt/ros/humble/include/rosbag2_interfaces",
"-I/opt/ros/humble/include/rosbag2_storage",
"-I/opt/ros/humble/include/rosbag2_storage_default_plugins",
"-I/opt/ros/humble/include/rosbag2_transport",
"-I/opt/ros/humble/include/rosgraph_msgs",
"-I/opt/ros/humble/include/rosidl_runtime_c",
"-I/opt/ros/humble/include/rosidl_runtime_cpp",
"-I/opt/ros/humble/include/rosidl_typesupport_c",
"-I/opt/ros/humble/include/rosidl_typesupport_cpp",
"-I/opt/ros/humble/include/rosidl_typesupport_fastrtps_c",
"-I/opt/ros/humble/include/rosidl_typesupport_fastrtps_cpp",
"-I/opt/ros/humble/include/rosidl_typesupport_interface",
"-I/opt/ros/humble/include/rosidl_typesupport_introspection_c",
"-I/opt/ros/humble/include/rosidl_typesupport_introspection_cpp",
"-I/opt/ros/humble/include/rqt_gui_cpp",
"-I/opt/ros/humble/include/rqt_image_view",
"-I/opt/ros/humble/include/rttest",
"-I/opt/ros/humble/include/rviz_common",
"-I/opt/ros/humble/include/rviz_default_plugins",
"-I/opt/ros/humble/include/rviz_rendering",
"-I/opt/ros/humble/include/sensor_msgs",
"-I/opt/ros/humble/include/shape_msgs",
"-I/opt/ros/humble/include/statistics_msgs",
"-I/opt/ros/humble/include/std_msgs",
"-I/opt/ros/humble/include/std_srvs",
"-I/opt/ros/humble/include/stereo_msgs",
"-I/opt/ros/humble/include/teleop_twist_joy",
"-I/opt/ros/humble/include/tf2",
"-I/opt/ros/humble/include/tf2_bullet",
"-I/opt/ros/humble/include/tf2_eigen",
"-I/opt/ros/humble/include/tf2_eigen_kdl",
"-I/opt/ros/humble/include/tf2_geometry_msgs",
"-I/opt/ros/humble/include/tf2_kdl",
"-I/opt/ros/humble/include/tf2_msgs",
"-I/opt/ros/humble/include/tf2_ros",
"-I/opt/ros/humble/include/tf2_sensor_msgs",
"-I/opt/ros/humble/include/tlsf",
"-I/opt/ros/humble/include/tlsf_cpp",
"-I/opt/ros/humble/include/tracetools",
"-I/opt/ros/humble/include/trajectory_msgs",
"-I/opt/ros/humble/include/turtlesim",
"-I/opt/ros/humble/include/unique_identifier_msgs",
"-I/opt/ros/humble/include/urdf",
"-I/opt/ros/humble/include/urdfdom",
"-I/opt/ros/humble/include/urdfdom_headers",
"-I/opt/ros/humble/include/urdf_parser_plugin",
"-I/opt/ros/humble/include/visualization_msgs"
],
"clangd.arguments": [
//"--all-scopes-completion",
"--compile-commands-dir=${workspaceFolder}/build", // 查找 compile_commands.json
"--background-index",
"--clang-tidy",
"--completion-style=detailed",
"--fallback-style=Microsoft",
"--function-arg-placeholders=true",
"--header-insertion=never",
"--header-insertion-decorators",
"--enable-config",
"-j=12",
"--query-driver=/usr/bin/c++,/usr/bin/g++", // 这个是重点,使用c++/g++进行库文件索引
"--pch-storage=memory",
"--pretty"
],
"cmake.ignoreCMakeListsMissing": true
}
文件 .clangd
:
yaml
CompileFlags:
Remove: [-march=*, -mabi=*]
Diagnostics:
# 禁用未使用头文件的警告,这在ROS2项目中很常见
UnusedIncludes: None
ClangTidy:
Add:
- "performance-*"
- "modernize-*"
- "cppcoreguidelines-*"
Remove:
- "cert-err58-cpp" # 避免关于静态变量初始化的警告
# 启用更详细的代码补全
Completion:
AllScopes: true
# 后台索引以提高性能
Index:
Background: Build
文件 .clang-format
:
yaml
---
Language: Cpp
BasedOnStyle: Microsoft #Google
# 基本设置
ColumnLimit: 180 # 行最大长度
Standard: Auto
TabWidth: 4
UseTab: Never