CPack:存档中缺少接口包含目录
CPack: Interface include directories are missing in archive
我正在使用 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 .
生成的tgz内容
├── lib
│ └── libTest.so
├── Test.cmake
└── Test-noconfig.cmake
知道为什么它会丢失 inc
目录吗?
Generator-like表达式$<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>
可能包含供项目内部使用的头文件,这些头文件没有安装。
我正在使用 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
目录吗?
Generator-like表达式$<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>
可能包含供项目内部使用的头文件,这些头文件没有安装。