我想使用
clangd
作为我的 linter,g++
作为我的编译器,CMake
作为我的构建系统。我的项目具有以下结构:
MyProject
├── build
│ ├── ...
├── CMakeLists.txt
├── compile_commands.json -> build/compile_commands.json
├── include
│ └── sorting
│ └── Sorting.h
├── main.cpp
└── src
└── sorting
└── Sorting.cpp
将头文件和实现文件分开是一个很好的做法,这就是为什么我有
include
和 src
目录。将 include
目录添加到路径也是一个很好的做法。这样,无论具体的层次结构如何,我都可以做到#include "Sorting.h"
。
到目前为止,我已经生成了以下 CMake 代码来实现此目的:
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
cmake_minimum_required(VERSION 3.27)
project(DSA
DESCRIPTION "My DSA Implementations"
LANGUAGES CXX)
add_library(sorting STATIC src/sorting/Sorting.cpp include/sorting/Sorting.h)
target_include_directories(sorting PUBLIC include)
add_executable(main main.cpp)
target_link_libraries(main PUBLIC sorting)
但是,这只会将
c++
命令导出到 compile-commands.json
,而我的 clangd
linter 仍然损坏。有办法实现我想要的吗?我能想到的最简单的解决方案是创建另一个 CMake 构建,其中编译器设置为 clang++
。
顺便说一句,我有一个
.clang-tidy
安装文件,是我使用 clang-tidy -checks=bugprone-\*,modernize-\*,performance-\*,readability-\*,cppcoreguidelines-\* --dump-config > .clang-tidy
生成的。难道这就是我烦恼的根源吗?
我失败的原因是不正确地包含
include
文件夹。正确的用法如下:
target_include_directories(sorting PUBLIC include)
#include "sorting/Sorting.cpp" // in main.cpp
或者,
target_include_directories(sorting PUBLIC include/sorting)
#include "Sorting.cpp" // in main.cpp
感谢@drescherjm 指出我的错误并提供额外的提示。