如何使用cmake使"compile_commands.json"适用于仅用于头的库



我正在学习CMake和clangd,但我找不到一种方法让CMake为clangd生成一个合适的compile_commands.json来解析第三方库。

以下是我尝试过的:

add_library(date_fmt INTERFACE)
target_include_directories(
date_fmt INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_sources(
date_fmt
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:include>/date_fmt/date_fmt.hpp
)
target_link_libraries(date_fmt INTERFACE date)
target_link_libraries(date_fmt INTERFACE fmt)

Sarcasm/compdb可以生成带有头文件的编译数据库。

只需pip install compdb即可安装软件,然后假设您有一个名为build的构建目录,使用compdb -p build/ list > compile_commands.json生成compile_commands.json。

问题是compile_commands.json只用于实际正在编译的东西。由于CMakeLists.txt只创建了一个INTERFACE库,没有任何东西使用它,因此不需要生成编译数据库。

CMakeLists.txt中添加类似内容

add_executable(smoke_test smoke_test.cpp)
target_link_libraries(smoke_test date_fmt)

smoke_test.cpp可以像int main() { return 0; }一样简单,只是一些可以编译的东西。

相关内容

最新更新