有谁知道在CMake文件中应用“包含一次”模式的简单方法吗?在C/C++中,它曾经在头文件的开始和结尾需要一个#ifdef/#endif对,直到#pragma一度变得很普遍。当然,也可以在CMake中做同样的事情,但是我认为如果它不需要明确的条件语句会更好。是否有包含一次cmake文件的命令?
重编:看起来,return()命令应该这样做。我会定义一个这样的宏:
macro(include_once)
if (INCLUDED_${CMAKE_CURRENT_LIST_FILE})
return()
endif()
set(INCLUDED_${CMAKE_CURRENT_LIST_FILE} true)
endmacro()
在文件的开头使用宏,没有任何参数。因为它是一个宏,所以返回来自文件的include命令,而不是来自宏本身。
请注意,创建的变量有一个奇怪的名称,但CMake似乎接受这一点。
什么是在CMake的文件你包括,你的设置是什么,你*会*要求防止多重包含?就个人而言,我通常拥有“main”CMakeLists.txt(它不包含“包含”)和带有辅助函数的模块(不会抱怨首先包含多个包含)。在这里,我不太清楚用例是什么。 – DevSolar
有各种各样的情况可能是必要的。具体来说,我有一个包含子目录的顶级项目,我想让每个子目录成为一个独立项目。所以顶级项目和所有的子级都包含一个共享的定义文件。如果定义文件打印的东西,它打印得比我想要的多得多。这是一个处理开销。等等。所以,我认为有充足的理由要求这样做。 –
如果子目录是作为独立项目构建的 - 每个项目的输出应该是独立完成的 - 或者处理开销的影响(即使对于大多数涉及的项目我都认为是微不足道的,我不相信印刷信息的冗余)用CMake处理,尽管我总是从一个单独的CMakeLists.txt构建(包含)。但我愿意让这个休息一下,指出Tsyvarev在“如何”和“为什么”这两个方面的出色答案。 – DevSolar