【问题标题】:CPack: Interface include directories are missing in archiveCPack:存档中缺少接口包含目录
【发布时间】:2018-02-22 16:05:09
【问题描述】:

我正在使用 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 目录吗?

【问题讨论】:

    标签: c++ cmake cpack


    【解决方案1】:

    target_include_directories() 命令中使用的类似生成器的表达式$&lt;INSTALL_INTERFACE&gt; 本身不安装 对应的目录。您需要手动安装此目录(使用install(FILES)install(DIRECTORY))。


    表达式$&lt;INSTALL_INTERFACE&gt; 指定配置文件中目标的接口包含目录,该目录导出安装 树(参见install(EXPORT) 命令)。

    表达式$&lt;BUILD_INTERFACE&gt; 指定的接口包括项目本身的目标目录,以及导出构建树的配置文件(参见EXPORT() 命令)。

    但是这些表达式并没有强制将$&lt;BUILD_INTERFACE&gt; 目录复制到$&lt;INSTALL_INTERFACE&gt; 安装时。相反,这个目录的内容通常不同:除了外部使用的头文件,安装到$&lt;INSTALL_INTERFACE&gt;目录,$&lt;BUILD_INTERFACE&gt;目录可能包含项目内部使用的头文件,这些头文件没有安装。

    【讨论】:

    • 虽然在这种情况下生成器表达式不相关,但我的印象是PUBLIC_HEADERINCLUDES属性可用于安装INTERFACE_INCLUDE_DIRECTORIES中设置的目录。在对文档进行更详细的审查后,情况并非如此,感谢您的提示!
    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2021-07-01
    • 2020-08-07
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多