cmake生成多个compile_commands.json?

时间:2018-04-07 00:43:48

标签: c++ vim cmake youcompleteme

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

此外,我已经谷歌搜索和了解了很多,但主要是找到与无法生成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 个答案:

答案 0 :(得分:1)

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

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

一种可能的解决方案可能是将头文件包含在源文件中(可能使用CMake自动生成),其中包含所有头文件(有点像PCH)。这还将确保标头编译,并确保在使用/发送库之前捕获任何错误。