c++ - CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?

标签 c++ cmake

如果我有这个源代码树:

C:\app:
    src:
        CMakeLists.txt
        main.cpp --> #include "acme/header_only_lib/api.h"

D:\3rdparty\acme\header_only_lib:
    api.h --> #include "detail.h"
    detail.h 

不使用符号链接(symbolic link)技巧,也不向 3rdparty 文件夹添加文件,如果我必须保留 #include "acme/header_only_lib/api.h"main.cpp , 我应该如何在 CMake 中指定 include 目录使得 api.h可以看到detail.h , 添加 D:\3rdparty\acme\header_only_lib 的全局包含目录? header-only-lib 既不是可执行文件也不是库目标,我无法修改它的代码。我也不想通过添加 D:\3rdparty\acme\header_only_lib 来污染我的全局包含目录因为里面的文件名太常见了,很容易与其他库/ future 的代码发生冲突。

有没有我可以说的 CMake 机制: D:\3rdparty\acme\header_only_lib\api.h , 添加 D:\3rdparty\acme\header_only_lib作为包含目录?

最佳答案

要将目录添加到包含目录的全局列表中,您可以使用例如

include_directories( ${CMAKE_SOURCE_DIR}/3rdparty )

请注意,您不应将绝对路径(如 D:\)硬编码到您的 CMakeLists.txt 中,因为这样就无法在任何其他位置构建您的项目。为此,CMake 提供了诸如 ${CMAKE_SOURCE_DIR}${CMAKE_BINARY_DIR} 之类的变量。

如果您只想将一个目录添加到构建的特定部分的包含目录列表中,您可以使用例如

target_include_directories( app PRIVATE ${CMAKE_SOURCE_DIR}/3rdparty )

这为目标(可执行文件/库)app 添加目录

请注意,如果您的 acme/header_only_lib 应该与 app 二进制文件一起安装,则此方法将不起作用,因为您的 acme header 需要在客户端机器上“看到”彼此,如果它们驻留在 acme/header_only_lib 子目录中但在没有子目录的情况下相互寻址,则这种情况不太可能发生。这将需要您的客户(他的构建没有使用您的 CMakeLists.txt)将 acme/header_only_lib 添加到包含路径您的 header 库可以正常工作——您不应该那样做。

关于c++ - CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62508105/

相关文章:

linux - 使用 CMake 在库中查找符号

linux - 我可以让 FIND_LIBRARY 在我的 *custom* 依赖项构建完成后运行吗?

c++ - 大括号初始化与括号错误

c++一次读入一个字符的c风格字符串?

C++ 析构函数和函数调用顺序

c++ - 适用于 Mac 的免费 C++ 编译器,具有开源许可证

c++ - 给定对象的父类(super class)指针,如何获取对象的大小?

node.js - 如何调试使用 CMake.js 构建的 Node.js 插件?

visual-studio - CMake - 仅当文件不存在时复制文件

CMake:如何规范路径?