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

CMake: Can we specify include directories for a specific set of files not forming an executable or lib?

本文关键字:可执行文件 文件 包含目 我们 一组 CMake      更新时间:2023-10-16

如果我有这个源代码树:

C:app:
src:
CMakeLists.txt
main.cpp --> #include "acme/header_only_lib/api.h"
D:3rdpartyacmeheader_only_lib:
api.h --> #include "detail.h"
detail.h 

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

有没有CMake机制,我可以说:对于D:3rdpartyacmeheader_only_libapi.h,添加D:3rdpartyacmeheader_only_lib作为包含目录?

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

include_directories( ${CMAKE_SOURCE_DIR}/3rdparty )

请注意,不应将绝对路径(如D:(硬编码到 CMakeList 中.txt因为这会使无法在任何其他位置生成项目。CMake 为此目的提供了${CMAKE_SOURCE_DIR}${CMAKE_BINARY_DIR}等变量。

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

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

这将仅添加目标(可执行文件/库(app的目录。

请注意,如果您的acme/header_only_lib应该与app二进制文件一起安装,则此方法将不起作用,因为您的 acme 标头需要在客户端计算机上"看到"彼此,如果它们驻留在acme/header_only_lib子目录中但彼此寻址而不使用子目录,则不太可能。这将要求你的客户端(他没有使用你的CMakeLists.txt进行构建(向包含路径添加acme/header_only_lib,以便你的头库工作 - 你不应该这样做。

使用include_directoriestarget_include_directories

include_directories("D:3rdparty")

如果只想对main目标进行此更改,则与target_include_directories一起或:

add_executable(main main.cpp)
target_include_directories(main PUBLIC "D:3rdparty")

然后你可以#include "acme/header_only_lib/api.h"#include <acme/header_only_lib/api.h>

仅标头库

如果您只想为header-only-lib执行此操作,则需要在其 CMake 文件中执行此操作。首先将库添加为没有源文件的INTERFACE

add_library(header-only INTERFACE) 

然后包括它的目录:

target_include_directories(header-only INTERFACE include-dir-for-header-only) 

然后将其链接到主目标

find_library(HeaderOnly
NAMES header-only
HINTS "D:3rdpartypath-to-lib"
)
target_link_libraries(main header-only)
相关文章: