Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将包含路径映射到不同的目录_C++_Cmake - Fatal编程技术网

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

C++ 将包含路径映射到不同的目录,c++,cmake,C++,Cmake,我正在寻找一种方法,告诉CMake使包含目录以另一个名称显示给编译器 比如说,我有一个项目需要来自国外库的代码。此代码驻留在项目根目录的foreignLib-1.5.0_build123456目录中。我会不时地更新这个库,并在这个过程中更改库目录名 < >我想把这个目录引用为我的C++源文件中的外部LIB。我想能够写作 #include "foreignLib/include/lib.h" CMake应该告诉我的编译器把它翻译成 #include "foreignLib-1.5.0_build

我正在寻找一种方法,告诉CMake使包含目录以另一个名称显示给编译器

比如说,我有一个项目需要来自国外库的代码。此代码驻留在项目根目录的foreignLib-1.5.0_build123456目录中。我会不时地更新这个库,并在这个过程中更改库目录名

< >我想把这个目录引用为我的C++源文件中的外部LIB。我想能够写作

#include "foreignLib/include/lib.h"
CMake应该告诉我的编译器把它翻译成

#include "foreignLib-1.5.0_build123456/include/lib.h"
现在我想知道:

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

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

您的代码文件:

#include "boilerplate/foreignLib_lib.h"
样板文件/外国图书馆_lib.h:

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

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

您的代码文件:

#include "boilerplate/foreignLib_lib.h"
样板文件/外国图书馆_lib.h:

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

使用CMake的
include_directories
语句或将
-I
开关添加到
*\u CXX_FLAGS
以将当前外文库路径添加到您的include path。

使用CMake的
include_directories
语句或将
-I
开关添加到
*\u CXX_FLAGS
以将当前外文库路径添加到您的目录包含路径。

您可以查看Cmake的配置文件:将源文件重命名为
yourfile.cpp.in
并执行以下操作

#include ${DIR_TO_LIB}/include/xy.h
在CMakeLists中,您以某种方式(通过解析命令行或其他方式)将变量
DIR\u设置为_LIB
,并发出

configure_file(yourfile.cpp.in, yourfile.cpp)
这将生成设置了正确路径的
yourfile.cpp


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

您可以看看Cmake的配置文件:将源文件重命名为
yourfile.cpp.in
并执行以下操作

#include ${DIR_TO_LIB}/include/xy.h
在CMakeLists中,您以某种方式(通过解析命令行或其他方式)将变量
DIR\u设置为_LIB
,并发出

configure_file(yourfile.cpp.in, yourfile.cpp)
这将生成设置了正确路径的
yourfile.cpp


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

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

一种体面的方法是使用在includes文件夹中收集文件列表,然后使用将它们复制到构建树中

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

set(ForeignLibName foreignLib-1.5.0_build123456)
set(ForeignLibRoot${CMAKE\u SOURCE\u DIR}/${ForeignLibName})
文件(GLOB_RECURSE includebles RELATIVE${ForeignLibRoot}${ForeignLibRoot}/*)
foreach(includefle${includefles})
配置_文件(${ForeignLibRoot}/${IncludeFile}
${CMAKE_BINARY_DIR}/${ForeignLibName}/foreignLib/${IncludeFile}
版权所有)
endforeach()
包含目录(${CMAKE\u BINARY\u DIR}/${ForeignLibName})
这将允许您执行以下操作:

#包括“foreignLib/include/lib.h”

更新外部库时,您必须确保还更新了CMakeLists.txt,以便下次进行构建时CMake重新运行。更新CMakeLists.txt应该只涉及更改单行
集合(ForeignLibName…

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

一种体面的方法是使用在includes文件夹中收集文件列表,然后使用将它们复制到构建树中

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

set(ForeignLibName foreignLib-1.5.0_build123456)
set(ForeignLibRoot${CMAKE\u SOURCE\u DIR}/${ForeignLibName})
文件(GLOB_RECURSE includebles RELATIVE${ForeignLibRoot}${ForeignLibRoot}/*)
foreach(includefle${includefles})
配置_文件(${ForeignLibRoot}/${IncludeFile}
${CMAKE_BINARY_DIR}/${ForeignLibName}/foreignLib/${IncludeFile}
版权所有)
endforeach()
包含目录(${CMAKE\u BINARY\u DIR}/${ForeignLibName})
这将允许您执行以下操作:

#包括“foreignLib/include/lib.h”

更新外部库时,您必须确保还更新了CMakeLists.txt,以便下次进行构建时CMake重新运行。更新CMAKLISTS.TXT只需要改变单行<代码> SET(Fu外LBNEX…)/代码> .< /P>如果您在UNIX类操作系统上,您应该认真考虑使用符号链接(文件系统)来实现这一点。该项目的目标是跨平台,因此使用OS依赖特性不是一种选择。另外,这是使用git作为版本控制,git似乎无法存储符号链接:自Windows Vista以来,NTFS具有符号链接。@Chris:您是否阅读了您所引用问题的公认答案?它声明git可以存储符号链接,并像人们期望的那样处理它们。但对于跨平台项目,这当然不是一个选项。@arne是的,确实是我的错。我读到git将符号链接存储为blob,并期望它只复制链接目标,但仔细检查后,它只复制符号链接信息,而不复制目标。但是,不兼容文件系统的问题仍然存在。Git不使用NTFS链接:如果你在UNIX类操作系统上,你应该认真考虑这样做。