0

我正在寻找一种方法来告诉 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

4 回答 4

2

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

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

于 2013-06-19T03:22:47.753 回答
1

你可以看看 Cmake 的 configure_file: Rename your source file into yourfile.cpp.inand do

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

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

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

这将产生yourfile.cpp正确的路径集。

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

于 2013-06-12T08:34:40.883 回答
0

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

你的代码文件:

#include "boilerplate/foreignLib_lib.h"

样板/foreignLib_lib.h:

#include "foreignLib-1.5.0_build123456/include/lib.h"
于 2013-06-12T07:43:59.490 回答
0

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

于 2013-06-12T07:50:35.420 回答