映射包含路径到不同的目录

Map include path to different directory

本文关键字:包含 路径 映射      更新时间:2023-10-16

我正在寻找一种方法来告诉CMake使包含目录出现在编译器的另一个名称下。

假设我有一个项目需要来自国外库的代码。这段代码位于项目根目录下的foreignLib-1.5.0_build123456目录中。我将不时地想要更新这个库,并在此过程中更改库的目录名称。

我想引用这个目录作为foreignLib在我的c++源文件。我想写

#include "foreignLib/include/lib.h"

和CMake应该告诉我的编译器将其转换为

#include "foreignLib-1.5.0_build123456/include/lib.h"

现在我想知道:

  • 这样的功能存在于CMake吗?
  • 如果是,如何使用?
  • 如果是,支持哪些编译器?

我可能只是复制整个包含目录到我的构建树,并使其可用。

一个体面的方法是使用file(GLOB_RECURSE ...)收集包含文件夹中的文件列表,然后使用configure_file(<input> <output> COPYONLY)将它们复制到构建树中。

通过使用configure_file,只在需要时替换构建树中的文件。这意味着重新运行CMake不会自动使这些文件在构建工具中显示为过期,从而避免了不必要的重新编译。

set(ForeignLibName foreignLib-1.5.0_build123456)
set(ForeignLibRoot ${CMAKE_SOURCE_DIR}/${ForeignLibName})
file(GLOB_RECURSE IncludeFiles RELATIVE ${ForeignLibRoot} ${ForeignLibRoot}/*)
foreach(IncludeFile ${IncludeFiles})
  configure_file(${ForeignLibRoot}/${IncludeFile}
                 ${CMAKE_BINARY_DIR}/${ForeignLibName}/foreignLib/${IncludeFile}
                 COPYONLY)
endforeach()
include_directories(${CMAKE_BINARY_DIR}/${ForeignLibName})

这应该允许你做:

#include "foreignLib/include/lib.h"

当你更新外部库时,你必须确保你也更新了CMakeLists.txt,以便下次你去构建时CMake重新运行。更新CMakeLists.txt应该只涉及更改单行set(ForeignLibName ...)

您可以查看Cmake的configure_file:将源文件重命名为yourfile.cpp.in并执行

#include ${DIR_TO_LIB}/include/xy.h

在您的CMakeLists中,您以某种方式设置变量DIR_TO_LIB(通过解析命令行或其他东西)并发出

configure_file(yourfile.cpp.in, yourfile.cpp)

这将产生具有正确路径设置的yourfile.cpp

这可能不是你想要的,但我认为它会工作。

作为构建过程的一部分,在一个众所周知的位置(后来称为"boilerplate/foreignLib_lib.h")生成一个包含文件,其中包含真正的包含路径。

你的代码文件

#include "boilerplate/foreignLib_lib.h"
样板/foreignLib_lib.h:

#include "foreignLib-1.5.0_build123456/include/lib.h"

使用CMake的include_directories语句或添加-I开关到*_CXX_FLAGS,以将当前的foreignLib路径添加到您的include路径