我正在使用CMake 3.10.1并尝试使用CPack为库生成存档,我无法将其添加到存档中的接口包含目录。
库和生成的导出文件按预期添加,但是包含目录(使用target_include_directories(... PUBLIC ...)
添加的内容)完全丢失。
CMakeLists.txt
:
cmake_minimum_required(VERSION 3.5)
project(Test VERSION 1.0.0 LANGUAGES CXX)
add_library(${PROJECT_NAME} SHARED foo.cpp) #add sources and executable
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/inc>
$<INSTALL_INTERFACE:inc>
)
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}
INCLUDES DESTINATION inc
PUBLIC_HEADER DESTINATION inc
LIBRARY DESTINATION lib
)
install(EXPORT ${PROJECT_NAME} DESTINATION .)
include(CPack)
我的源目录的内容:
├── CMakeLists.txt
├── foo.cpp
└── inc
└── foo.h
cpack -G TGZ .
├── lib
│ └── libTest.so
├── Test.cmake
└── Test-noconfig.cmake
有什么想法可能会错过inc
目录?
答案 0 :(得分:1)
$<INSTALL_INTERFACE>
命令中使用的类似于生成器的表达式target_include_directories()
本身不会安装对应的目录。您需要手动安装此目录(使用install(FILES)
或install(DIRECTORY)
)。
表达式$<INSTALL_INTERFACE>
指定配置文件中目标的接口包含目录,该目录导出 install 树(请参阅install(EXPORT)
命令)。
表达式$<BUILD_INTERFACE>
指定的接口包括项目本身中目标的目录,以及导出构建树的配置文件(参见EXPORT()
命令)。
但这些表达式并未强制$<BUILD_INTERFACE>
目录在安装时被复制到$<INSTALL_INTERFACE>
目录中。相反,此目录的内容通常不同:除了用于外部使用的头文件,安装到$<INSTALL_INTERFACE>
目录中,目录$<BUILD_INTERFACE>
可能包含项目内部使用的头文件,这些文件未安装。