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

时间:2013-06-12 07:23:56

标签: c++ cmake

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

假设我有一个需要来自外国图书馆代码的项目。此代码驻留在项目根目录中的foreignLib-1.5.0_build123456目录中。我不时会想要更新这个库,并在此过程中更改库目录名称。

我想在我的C ++源文件中将此目录引用为foreignLib。我希望能够写

#include "foreignLib/include/lib.h"

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

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

现在我想知道:

  • CMake中是否存在这样的功能?
  • 如果是,我该如何使用它?
  • 如果是,支持哪些编译器?

4 个答案:

答案 0 :(得分:2)

我可能只是将整个include目录复制到我的构建树中并使其可用。

这样做的一个不错的方法是使用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 ...)

答案 1 :(得分:1)

您可以查看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并设置正确的路径。

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

答案 2 :(得分:0)

作为构建过程的一部分,使用真实的包含路径在一个众所周知的位置(后来称为“样板”/ boilerLib_lib.h“)生成一个包含文件。

您的代码文件:

#include "boilerplate/foreignLib_lib.h"

样板/ foreignLib_lib.h:

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

答案 3 :(得分:0)

使用CMake的include_directories语句或向-I添加*_CXX_FLAGS开关,将当前的foreignLib路径添加到包含路径。