我很难弄清楚如何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()将文件添加PRIVATE到PUBLIC构建中。应在安装过程中安装所有PUBLIC(和)源。INTERFACE
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<>
| 归档时间: |
|
| 查看次数: |
4283 次 |
| 最近记录: |