gpt4 book ai didi

c++ - CMake:当我尝试添加源目录本身或其子目录之一时,target_include_directories() 会打印错误

转载 作者:IT老高 更新时间:2023-10-28 13:02:47 25 4
gpt4 key购买 nike

我正在编写一个 C++ 库(仅 header )并使用 CMake 生成我的 (Visual Studio) 项目和解决方案文件。我还在编写一个测试套件,它是同一个 CMake 项目的一部分。

当我在代表我的仅 header 库的目标上调用 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.

(D:/Projects/GPC/Fonts 是我的库项目的顶级目录。顺便说一句,如果我将头文件移动到顶级目录,问题仍然存在。)

我的 CMakeLists.txt 中的违规行是这样的(为简单起见而改编):

target_include_directories(Fonts INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")

我不明白我做错了什么。如果没有 target_include_directories(),消费者项目的代码根本无法包含我的头文件(除非以安装形式,但我还没有做到这一点,无论如何我希望能够从它的构建树中使用我的库,无需安装。)

我觉得我在这里缺少一些基本的东西;但是我已经搜索了几个小时,但没有找到解决方案或解释。

最佳答案

问题的根源不是 target_include_directories 命令本身,而是尝试 install 在源路径中具有公共(public)或接口(interface)包含目录前缀的目标(即包含目录是 ${PROJECT_SOURCE_DIR} 的子目录。 )

虽然在从头开始构建库时使用绝对路径是非常好的和可取的,但引入该库的预构建版本的第三方库可能希望使用不同的包含路径。毕竟,您不希望所有用户都镜像构建机器的目录结构,而只是为了最终进入正确的包含路径。

CMake's packaging mechanism 为这两个用例提供支持:您可以直接从构建树中拉入库(即,检查源代码,构建它,然后将 find_package() 指向目录),或从安装目录(运行 make INSTALL 将构建的东西复制到安装目录并将 find_package() 指向 that 目录)。后一种方法需要可重定位(也就是说,我在我的机器上构建和安装,将生成的目录发送给您,您将能够在您的机器上从不同的目录结构中使用它),而前者不是。

这是一个非常简洁的功能,但是您在设置包含目录时必须考虑到它。引用 target_include_directories 的手册:

Include directories usage requirements commonly differ between thebuild-tree and the install-tree. The BUILD_INTERFACE andINSTALL_INTERFACE generator expressions can be used to describeseparate usage requirements based on the usage location. Relativepaths are allowed within the INSTALL_INTERFACE expression and areinterpreted relative to the installation prefix. For example:

target_include_directories(mylib PUBLIC  
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
$<INSTALL_INTERFACE:include/mylib> # <prefix>/include/mylib
)

BUILD_INTERFACE and INSTALL_INTERFACE generator expressions 发挥了一切作用:

$<INSTALL_INTERFACE:...>

Content of ... when the property is exported using install(EXPORT), and empty otherwise.

$<BUILD_INTERFACE:...>

Content of ... when the property is exported using export(), or when the target is used by another target in the same buildsystem.Expands to the empty string otherwise.

关于c++ - CMake:当我尝试添加源目录本身或其子目录之一时,target_include_directories() 会打印错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25676277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com