cmake 生成多个 compile_commands.json?

cmake generate multiple compile_commands.json?

我一直在使用带有 vim 的 cmake 并生成一个 compile_commands.json 文件以获得自动完成功能。我遇到的问题是我有一个文件结构

build     include     src

我的所有头文件都在 include 目录中,源文件在 src 中。在使用 cmake 时,我设置 set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 为项目生成代码完成数据库。当生成 compile_commands.json 时,它仅适用于包含我的 CMakeLists.txt 文件 (src) 的文件夹,因此我没有完成 include 目录中的头文件。

有没有办法为这个单独的文件夹生成 compile_commands.json?我最终是否需要将所有头文件放在与源代码相同的文件夹中?

澄清一下,只有一个正在构建的 cmake 项目,因此头文件不对应于一个单独的项目,例如库。

我也用谷歌搜索和 SOed 了很多,但我主要是在寻找与人们无法生成 compile_commands.json 有关的东西,但是我也在其他网站上看到 clang 无法解析头文件?我看到有关 clang 不解析头文件以生成完成数据库的信息是几年前的事了,但这就是我 运行 陷入困境的原因吗?

gitlab cmake header files

此外,如果有人知道可以解决我的情况的解决方法,我们也将不胜感激。

如果有助于澄清我的情况,请参阅下面的 CMakeLists.txt 文件,谢谢:

CMAKE_MINIMUM_REQUIRED(VERSION 3.11.0 FATAL_ERROR)
project(inheritance VERSION 0.1.1 LANGUAGES CXX)

# add executable
add_executable(inheritance main.cpp CommissionEmployee.cpp)
target_include_directories(inheritance PRIVATE ../include)
target_compile_features(inheritance PRIVATE cxx_std_14)

# generate compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

compile_commands.json 有源文件的编译命令。除非头文件是翻译单元的一部分,否则不会编译头文件。您也许可以使用周围的源文件做出最佳猜测,但这很容易出错。

请记住,头文件的编译标志可能不同,具体取决于包含它的源文件。

一个可能的解决方案是将头文件包含在一个包含所有头文件(有点像 PCH)的源文件中(可能 auto-generated 使用 CMake)。这也将确保头文件编译,并且在您 use/ship 库之前捕获任何错误。