【问题标题】:CMake - How to install(DIRECTORY) in install(TARGETS)?CMake - 如何在安装(目标)中安装(目录)?
【发布时间】:2019-09-05 01:50:52
【问题描述】:

我的这段代码的目标是将一个包含包含文件夹的静态库复制到另一个目录中。

新目录将具有结构

output_dir
    ├───include
    ├───lib
         └───win64

我有两行 install 的 CMake 代码行,我想减少到一行。首先,我将 lib 目标安装到output_dir/lib/win64,将include 目录安装到output_dir/include

add_library(lib STATIC test.cpp )

target_include_directories(lib 
    PUBLIC 
        ${PROJECT_SOURCE_DIR}/include
)

install(TARGETS lib
    ARCHIVE
        DESTINATION 
            ${PROJECT_SOURCE_DIR}/build/output_dir/lib/win64
)

install(DIRECTORY
            ${PROJECT_SOURCE_DIR}/include
        DESTINATION
            ${PROJECT_SOURCE_DIR}/build/output_dir/include
)

我想有效地将​​两个安装命令减少到一个,这是我最好的尝试。静态 lib 库被正确复制,但目录被忽略。

install(TARGETS lib
        ARCHIVE
            DESTINATION 
                ${PROJECT_SOURCE_DIR}/build/output_dir/lib/win64
        PUBLIC_HEADER
            DESTINATION
                ${PROJECT_SOURCE_DIR}/build/output_dir/
        INCLUDES
            DESTINATION
                ${PROJECT_SOURCE_DIR}/build/output_dir/     
)

我知道 public_header 的错误,但我做错了什么?

【问题讨论】:

    标签: visual-studio cmake


    【解决方案1】:

    您应该只需要 install() 命令中的 PUBLIC_HEADER 参数,而不需要 INCLUDES 参数。但是,您的 PUBLIC_HEADER 参数不会获取任何头文件,因为尚未设置 lib 目标的 PUBLIC_HEADER 属性。试试这样的:

    add_library(lib STATIC test.cpp)
    
    target_include_directories(lib 
        PUBLIC 
            ${PROJECT_SOURCE_DIR}/include
    )
    
    # List the headers we want to declare as public for installation.
    set(MY_PUBLIC_HEADERS
        ${PROJECT_SOURCE_DIR}/include/MyHeader.hpp
        ${PROJECT_SOURCE_DIR}/include/MyHeader2.hpp
        ...
    )
    
    # Tell the target these headers are "public".
    set_target_properties(lib PROPERTIES PUBLIC_HEADER "${MY_PUBLIC_HEADERS}")
    
    install(TARGETS lib
        ARCHIVE
            DESTINATION ${PROJECT_SOURCE_DIR}/build/output_dir/lib/win64
        PUBLIC_HEADER
            DESTINATION ${PROJECT_SOURCE_DIR}/build/output_dir   
    )
    

    【讨论】:

    • 我可以跳过列出标题而直接做:set_target_properties(lib PROPERTIES PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include)
    • 不,它没有工作。 Error CMake Error at src/CMakeLists.txt:25 (install): install PUBLIC_HEADER given directory
    • 我的包含文件夹有另一个文件夹。所以我想我必须坚持目录方法。
    • 不,它们必须列在分号分隔的列表中,这就是变量MY_PUBLIC_HEADERS周围有引号的原因。
    • @j__gt 如果你有多个/嵌套的包含目录,你可以做类似file(GLOB_RECURSE MY_PUBLIC_HEADERS *.hpp) 的东西。但不推荐使用GLOB,因为 CMake 不会检测到对头文件的更改。
    猜你喜欢
    • 2023-01-25
    • 2016-03-30
    • 2017-01-14
    • 2022-12-18
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2014-03-25
    • 2018-07-16
    相关资源
    最近更新 更多