CMake target_sources 并安装

Joe*_*ann 6 cmake

我很难弄清楚如何PUBLIC安装target_sources().

除了将私有源添加到可执行文件之外,这似乎target_sources()有点神秘。在阅读了大量材料之后,尤其是这篇博客文章很有帮助,我设法理解并绕过了target_sources()PUBLIC 文件的问题。CMakeLists.txt我的 C++ 库项目的许多子目录之一中的A如下所示:

target_sources(mylib
    PRIVATE
        foo.cpp

    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/foo.hpp>
        $<INSTALL_INTERFACE:foo.hpp>
)
Run Code Online (Sandbox Code Playgroud)

这使我能够成功构建该库。但是,在安装时,永远不会安装PUBLIC部分中列出的头文件。target_sources()

我的安装如下所示:

install(
    TARGETS
        mylib
    EXPORT mylib-targets
    LIBRARY
        DESTINATION ${CMAKE_INSTALL_LIBDIR}
        COMPONENT lib
    ARCHIVE
        DESTINATION ${CMAKE_INSTALL_LIBDIR}
        COMPONENT lib
    RUNTIME
        DESTINATION ${CMAKE_INSTALL_BINDIR}
        COMPONENT bin
    INCLUDES
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib
Run Code Online (Sandbox Code Playgroud)

但是,这不会安装任何标头。这个stackoverflow 答案提到了使用,PUBLIC_HEADER但阅读文档并没有让我觉得这与我的情况相关。

问题:PUBLIC安装或INTERFACE使用标头的正确方法是什么install()

背景:CMakeLists.txt我的目标是在源代码树的每个子目录中都有一个单独的子目录。这些列表中的每一个都应该用于target_sources()将文件添加PRIVATEPUBLIC构建中。应在安装过程中安装所有PUBLIC(和)源。INTERFACE

Tsy*_*rev 5

PUBLICtarget_sources命令部分与使用命令选项安装的公共标头没有任何共同点PUBLIC_HEADERinstall

您希望将库视为公共的标头应在目标的PUBLIC_HEADER属性中列出。

install(TARGETS)的文档有一个很好的设置和安装私有标头的示例。在你的情况下,这将是:

# This defines `foo.hpp` located in the current source directory as a 'public header'.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER foo.hpp)
# This install public headers among with the library.
install(
  TARGETS
    mylib
  PUBLIC_HEADER
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib
  # ... other options
)
Run Code Online (Sandbox Code Playgroud)

另请参阅相关问题:如何配置 CMakeLists.txt 以安装共享库的公共标头?


另请注意, thatINCLUDES和commandPUBLIC_HEADERS的子句install(TARGETS)不同的东西:

  • INCLUDES指定已安装库的包含目录
  • PUBLIC_HEADERS指定安装时将复制所有目标的公共标头的目录。

例如,如果您希望通过使用您的头文件

#include <mylib/foo.h>
Run Code Online (Sandbox Code Playgroud)

那么您需要为install()命令提供以下选项:

  PUBLIC_HEADER
    # The header will be places at ${CMAKE_INSTALL_INCLUDEDIR}/mylib/foo.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib
  INCLUDES
    # This directory will be used as include directory.
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
Run Code Online (Sandbox Code Playgroud)

因此,通过指令中的相对路径<include-directory>加入(通过/)将给出头文件的绝对路径。#include<>