我正在编写一个C++库(仅限标题),并使用CMake生成我的(Visual Studio)项目和解决方案文件.我也在编写一个测试套件,它是同一个CMake项目的一部分.
当我在代表我的仅头文件库的目标上调用target_include_directories()时,会出现问题,因此我的库的使用者可能会找到其头文件.我收到以下错误消息(即使生成没有中止).
CMake Error in CMakeLists.txt:
Target "Fonts" INTERFACE_INCLUDE_DIRECTORIES property contains path:
"D:/Projects/GPC/fonts/include"
which is prefixed in the source directory.
Run Code Online (Sandbox Code Playgroud)
(D:/ Projects/GPC/Fonts是我的库项目的顶级目录.如果我将头文件移动到顶层目录,问题仍然存在.)
我的CMakeLists.txt中的违规行是这个(为简单起见):
target_include_directories(Fonts INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")
Run Code Online (Sandbox Code Playgroud)
我不明白我做错了什么.没有target_include_directories(),消费者项目的代码根本不能包含我的头文件(除非在已安装的形式,但我还没有达到这一点,并且无论如何我希望能够从其构建树中使用我的库,没有安装.)
我觉得我在这里缺少一些基本的东西; 但是我没有找到解决方案或解释就搜索了几个小时.
我很难弄清楚如何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