让编译器查找Cmake创建的文件

让编译器查找Cmake创建的文件,c,path,cmake,out-of-source,C,Path,Cmake,Out Of Source,我正在使用Cmake中的configure\u file命令进行功能可用性检查,如前所述。该页面建议使用如下命令: configure_file(config.h.in config.h) 这将把${CMAKE\u CURRENT\u SOURCE\u DIR}/config.h.in转换为${CMAKE\u CURRENT\u BINARY\u DIR}/config.h。但是当我编译程序时,编译器只在${CMAKE\u CURRENT\u SOURCE\u DIR}中查找头(例如confi

我正在使用Cmake中的
configure\u file
命令进行功能可用性检查,如前所述。该页面建议使用如下命令:

configure_file(config.h.in config.h)
这将把
${CMAKE\u CURRENT\u SOURCE\u DIR}/config.h.in
转换为
${CMAKE\u CURRENT\u BINARY\u DIR}/config.h
。但是当我编译程序时,编译器只在
${CMAKE\u CURRENT\u SOURCE\u DIR}
中查找头(例如
config.h
),而不是在
${CMAKE\u CURRENT\u BINARY\u DIR}
中。因此,很自然,编译器找不到生成它的
config.h
,构建失败

解决这个问题的标准方法是什么?我是否应该更改
CMakeLists.txt
,以便在源目录中创建
config.h
?或者我应该更改它以将构建目录添加到include路径?(真的,为什么我要手动处理这个问题?[半反问])


关注一个类似的问题,但这两个选项都是可能的解决方案;我想知道是否有一个标准的实践,或者这是否表明我遗漏了一些关于如何使用Cmake的信息。

我认为没有一个标准的方法来处理这个问题,但从我自己对其他项目的有限看法来看,似乎没有绝大多数的方法。如果我猜的话,我认为将生成的文件放在构建树中比放在源树中更常见

为了清晰起见,我个人倾向于将它放在一个子目录中,如
${CMAKE\u CURRENT\u BINARY\u DIR}/GeneratedFiles/config.h
。这避免了在像VisualStudio这样的IDE的自动完成列表中出现
${CMAKE\u CURRENT\u BINARY\u DIR}
的所有子目录。它还可以使构建根目录更加干净,特别是当您最终生成多个文件时。您必须首先创建目录:

set(GeneratedFilesDir“${CMAKE\u CURRENT\u BINARY\u DIR}/GeneratedFiles”)
文件(生成目录${GeneratedFilesDir})
set(ConfigFile“${GeneratedFilesDir}/config.h”)
配置_文件(config.h.in${ConfigFile})

然后,您也许可以通过使用而不是使用来执行更多的“损害限制”。例如,如果config.h仅由库
MyLib
内部使用,则可以执行以下操作:

add_库(MyLib${ConfigFile}…其他源…)
目标目录包括目录(MyLib
私有${CMAKE_CURRENT_SOURCE_DIR}/src${GeneratedFilesDir}
公共${CMAKE\u CURRENT\u SOURCE\u DIR}/include)
与使用
include_目录
不同,这避免了所有目标都将
${GeneratedFilesDir}
作为包含路径



当生成的文件需要作为公共头公开,或添加到
install
命令时,事情变得更具争议性。最终,我认为这里没有“错误”的选择。归根结底,这取决于您是否觉得以牺牲更复杂的CMake设置为代价来保持源代码树的原始状态更好。

保持源代码树的原始状态是正确的,而如果您想执行多个不同的构建,或者如果您想通过rm'ing build dir来清理构建,则不这样做是错误的(如果要向源目录生成内容,则这是不够的)

在builddir中生成它并添加include路径

设置变量

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
使每个源目录的相应构建目录自动添加,并使其成为其他目标使用的可传递行为(例如,
foo
不必显式添加
bar
的构建目录)


对于源代码外版本,添加
包含目录(${CMAKE\u CURRENT\u BINARY\u DIR})