我有一个关于CPack的问题。 我有一个项目test_lib_1依赖于其他 2 个项目test_lib_2和test_lib_3。 test_lib_2 和 3 都定义了自己的 CPACK 规则,定义了要打包PUBLIC_HEADER。 test_lib_1具有相同的规则,打包二进制文件和一些public_headers。使用 CPack,我得到了一个包,其中包含test_lib_1及其公共标头的二进制文件,其他两个子项目的二进制文件(动态库(,以及两个子项目的公共标头:即test_lib_2和test_lib_3。
这是我的 CMakeLists.txt用于test_lib_1(对于其他两个,文件是相似的,不包含两个子项目(。
cmake_minimum_required(VERSION 3.10)
set(PROJECT_NAME "test_lib_1")
set(PROJECT_VERSION 1.0.0)
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/opt/company")
project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} DESCRIPTION "test_lib_1 description")
file(GLOB PROJECT_INTERFACE "include/*.h")
file(GLOB PROJECT_HEADERS "src/*.h")
file(GLOB PROJECT_SRCS "src/*.cpp")
add_subdirectory(test_lib_2)
add_subdirectory(test_lib_3)
add_library(${PROJECT_NAME} SHARED ${PROJECT_INTERFACE} ${PROJECT_HEADERS} ${PROJECT_SRCS})
target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(${PROJECT_NAME} test_lib_2)
target_link_libraries(${PROJECT_NAME} test_lib_3)
set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION})
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${PROJECT_INTERFACE}")
install(TARGETS ${PROJECT_NAME}
PUBLIC_HEADER DESTINATION "include"
ARCHIVE DESTINATION "lib"
RUNTIME DESTINATION "bin"
LIBRARY DESTINATION "bin"
)
set(CPACK_PACKAGE_CONTACT "Contact")
if(WIN32)
set(CPACK_GENERATOR ZIP)
else()
set(CPACK_GENERATOR "DEB" )
set(CPACK_SET_DESTDIR TRUE )
endif()
include(CPack)
我目前的输出是: 宾-> test_lib_1.dll;test_lib_2.dll;test_lib_3.dll 包括 -> test_lib_1.h;test_lib_2.h;test_lib_3.h ...
预期为: 宾-> test_lib_1.dll;test_lib_2.dll;test_lib_3.dll 包括 -> test_lib_1.h;
没有test_lib_2和test_lib_3公共标头。
知道吗?
我只是自己找到了一个可能的解决方案。 这个想法是将安装 + cpack 部分与
get_directory_property(hasParent PARENT_DIRECTORY)
if(NOT hasParent)
...
endi()
这样,如果当前项目是子项目,则它不会填充 install 和 cpack 的变量,也不会参与安装和 cpack 指令。
希望它可以帮助他人