映射包含路径到不同的目录
Map include path to different directory
我正在寻找一种方法来告诉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路径
- 如何使用cppcheck处理半相对包含路径
- 如何确定包含路径的来源?
- 生成文件缺少包含路径 尽管路径存在并已定义
- 更改包含路径
- 在 Android Studio 中添加 C/C++ 的包含路径
- 如何设置 CMake 来构建包含路径包含的代码,如 #include < libdir/lib>?
- 在Visual Studio Code(.json配置)中设置相对于工作区路径的c / c ++项目的包含路径
- 如何在 pybind11 项目中设置包含路径
- CLion 不索引任何外部包含路径
- VS代码无法识别包含路径
- 使用相对标头包含路径重新分析 ASTUnit 失败
- 如何在忍者上添加包含路径,并为VS 2019添加叮当
- 使用 glibc 2.7 包含路径编译失败
- 通过程序代码行设置C++包含路径
- Visual Studio添加真正"global"默认包含路径
- target_include_directories生成的包含路径
- C++'Undefined reference to'错误,尽管包含路径中的头文件中存在函数定义
- 如何从 qmake 中的包含路径中删除项目的根目录
- 是什么让 clang 在包含路径的子目录中看起来?
- 如果库的包含路径设置不符合预期,如何引发编译错误