【发布时间】:2020-03-18 09:31:30
【问题描述】:
我很难弄清楚如何安装target_sources() 中指定的PUBLIC 标头。
似乎target_sources() 对于除了将私有源添加到可执行文件之外的任何东西都有些神秘。
在阅读了大量材料后,尤其是 this blog entry 很有帮助,我设法理解并绕过了 target_sources() 和 PUBLIC 文件的问题。我的 C++ 库项目的许多子目录之一中的 CMakeLists.txt 如下所示:
target_sources(mylib
PRIVATE
foo.cpp
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/foo.hpp>
$<INSTALL_INTERFACE:foo.hpp>
)
这使我能够成功构建库。但是,在安装时,target_sources() 的 PUBLIC 部分中列出的头文件永远不会安装。
我的安装如下所示:
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
但是,这不会安装任何标头。
这个stackoverflow answer 提到了PUBLIC_HEADER 的使用,但阅读文档并没有让我觉得这与我的情况相关。
问题:使用install() 安装PUBLIC 或INTERFACE 标头的正确方法是什么?
背景:我的目标是在我的源代码树的每个子目录中都有一个单独的CMakeLists.txt。这些列表中的每一个都应该使用target_sources() 将PRIVATE 和PUBLIC 文件添加到构建中。所有PUBLIC(和INTERFACE)源都应该在安装过程中安装。
【问题讨论】:
-
那么您最终是否将
set_target_properties和target_sources添加到您的每个子目录CMakeLists.txt中? -
是的。现在一切都使用子目录中的各种
target()函数完成了。但是,公共标头会添加到名为HEADERS_PUBLIC的列表中,然后将其传递给target_sources()以及相应的安装指令。如果这对您有所帮助,我可以用骨架发布一篇关于此的博客文章。可能需要几天时间。 -
不,没关系。不过谢谢你的提议。我相信我现在可以正常工作了;虽然我没有在子目录
CMakeLists.txt中使用install命令(从您的评论来看,这听起来像是您正在做的事情)。
标签: cmake