簡體   English   中英

cmake compile_commands.json 用於接口目標

[英]cmake compile_commands.json for interface target

我有一個簡單的 c++ 庫,應該作為僅標頭庫提供。 該庫依賴於通過CPM安裝的其他庫。

我正在使用 VS 代碼和compile_commands.json來通知 VS 代碼有關 CPM 包中包含路徑的信息。 只要項目配置為共享/靜態庫或二進制文件,它就可以工作。 但是,當使用INTERFACE目標時,它不再起作用(compile_commands.json 已生成,但 VS 代碼顯示包含路徑錯誤)。

如何將compile_commands.json與接口目標(僅標頭庫)一起使用?

下面的配置在定義二進制目標時確實有效(用PUBLIC替換INTERFACE )!

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)

主.cpp

#include <yaml-cpp/yaml.h>

事實證明我只是使用了錯誤的目標。 接口不包含任何源文件,因此不會生成任何有意義的compile_commands.json

我正在尋找的是object 目標,它完全解決了我的問題。

僅供參考,這就是“正確”的 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM