保留 g++ 作为默认编译器,但也导出 clang 命令,以便将包含目录添加到路径

问题描述 投票:0回答:1

我想使用

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
生成的。难道这就是我烦恼的根源吗?

c++ cmake clang clangd
1个回答
0
投票

我失败的原因是不正确地包含

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 指出我的错误并提供额外的提示。

© www.soinside.com 2019 - 2024. All rights reserved.