[英]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.