CMake生成多个compile_commands.json文件?

3

我一直在使用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项目,因此头文件不对应于单独的项目,例如库。

此外,我已经在Google和SO上搜索了很多,但主要是找到与无法生成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)
1个回答

1

compile_commands.json 中包含源文件的编译命令。除非头文件是翻译单元的一部分,否则头文件不会被编译。您可以尝试使用周围的源文件进行最佳猜测,但这样很容易出错。

请记住,头文件的编译标志可能因包含它的源文件而异。

一个可能的解决方案是将头文件包含在一个源文件中(可能使用 CMake 自动生成),该源文件包含所有的头文件(类似于 PCH)。这也将确保头文件被编译并且在使用/发布库之前捕获任何错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接