如果我有这个源代码树:
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/