CPack 子项目和公共标头

Posted

技术标签:

【中文标题】CPack 子项目和公共标头【英文标题】:CPack Subprojects and Public Header 【发布时间】:2018-10-05 14:21:56 【问题描述】:

我有一个关于 CPack 的问题。 我有一个项目 test_lib_1,它依赖于另外两个项目 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。

这是我的 test_lib_1 的 CMakeLists.txt(对于其他两个,文件类似,但不包含两个子项目)。

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)

我目前的输出是: bin -> test_lib_1.dll; test_lib_2.dll; test_lib_3.dll 包括-> test_lib_1.h; test_lib_2.h; test_lib_3.h ...

预计会是: bin -> test_lib_1.dll; test_lib_2.dll; test_lib_3.dll 包括 -> test_lib_1.h;

没有 test_lib_2 和 test_lib_3 公共标头。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我自己找到了一个可能的解决方案。 这个想法是用

括起来 install + cpack 部分
get_directory_property(hasParent PARENT_DIRECTORY)
if(NOT hasParent)
...
endi()

这样,如果当前项目是子项目,则不填充install和cpack变量,不参与install和cpack指令。

希望对他人有所帮助

【讨论】:

以上是关于CPack 子项目和公共标头的主要内容,如果未能解决你的问题,请参考以下文章

向公共 API 发出请求时出现“无 'Access-Control-Allow-Origin' 标头”错误

我可以在公共标头中而不是在私有标头中将变量声明为const吗?

C ++创建指向标头内所有公共静态成员函数的指针数组,然后使用它

打包静态库时如何隐藏标题?

是否有公共 psk 服务器来测试 tls 握手?

公共桶的S3 CORS策略