cmake compile_commands.json 接口目标

cmake compile_commands.json for interface target

我有一个简单的 c++ 库,应该作为 header-only 库发布。该库依赖于通过 CPM.

安装的其他库

我正在使用 VS 代码和 compile_commands.json 来通知 VS 代码有关来自 CPM 包的包含路径。只要项目配置为 shared/static 库或二进制文件,它就可以工作。 但是,当使用 INTERFACE 目标时,它不再起作用(生成 compile_commands.json 但 VS 代码显示包含路径错误)。

如何将 compile_commands.json 与接口目标(header-only 库)一起使用?

以下配置在定义二进制目标时有效(将 INTERFACE 替换为 PUBLIC)!

CMakeLists.txt:

cmake_minimum_required(VERSION 3.21 FATAL_ERROR)

project(CpmCompileCommandsBug
    LANGUAGES CXX
)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

include(cmake/CPM.cmake)

CPMAddPackage(
    NAME yaml-cpp
    VERSION 0.6.3
    GITHUB_REPOSITORY jbeder/yaml-cpp
    GIT_TAG yaml-cpp-0.6.3
    OPTIONS
        "YAML_CPP_INSTALL ON"
)

add_library(${PROJECT_NAME} INTERFACE)
target_link_libraries(${PROJECT_NAME} INTERFACE yaml-cpp)

# the below target config does work
# add_library(${PROJECT_NAME} STATIC main.cpp)
# target_link_libraries(${PROJECT_NAME} PUBLIC yaml-cpp)

main.cpp:

#include <yaml-cpp/yaml.h>

原来我只是用错了目标。接口不包含任何源文件,因此不会生成任何有意义的 compile_commands.json.

我正在寻找的是对象目标,它完全解决了我的问题。

仅供参考,这是“正确”CMakeLists.txt 的样子:

cmake_minimum_required(VERSION 3.21 FATAL_ERROR)

project(CpmCompileCommandsBug
    LANGUAGES CXX
)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

include(cmake/CPM.cmake)

CPMAddPackage(
    NAME yaml-cpp
    VERSION 0.6.3
    GITHUB_REPOSITORY jbeder/yaml-cpp
    GIT_TAG yaml-cpp-0.6.3
    OPTIONS
        "YAML_CPP_INSTALL OFF"
)

# using OBJECT instead of INTERFACE allows passing source files
add_library(${PROJECT_NAME} OBJECT main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC yaml-cpp)