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)
我有一个简单的 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)