我实际上有一个简单的问题,但无法找到答案。也许你可以指点我一式两份。所以,问题是:是否有可能告诉cmake指示编译器在每个源文件的开头自动包含一些头文件,因此不需要放入#include foo.h? 谢谢!
答案 0 :(得分:20)
CMake没有针对此特定用例的功能,但正如您所暗示的那样,GCC等编译器具有-include
标志,其行为就像源中有#include "foo.h"
一样文件,因为CMake可以将参数传递给编译器,你可以通过add_definitions
。
This answer涵盖GCC,Clang和MSVC的标志,它应涵盖许多基础。因此在CMake中,检测编译器是什么并传递适当的标志。
以下是CMake代码的外观:
if(MSVC)
add_definitions(/FI"foo.h")
else()
# GCC or Clang
add_definitions(-include foo.h)
endif()
一般来说,这样做是个坏主意。代码检查工具(如IDE或doxygen)将被它混淆,更不用说其他人在看代码了。如果并非所有源文件实际上都需要定义,则添加额外的#include
将减慢编译时间。如果您在所有源文件中确实需要相同的标头(并且它不是系统标头),则可能是代码中高耦合的症状。为了什么好处?不必在文件中添加一行?
但是,有必要注意编译器支持这一点是有原因的;有一些奇怪的边缘情况(example 1,example 2),这是一件很有用的事情。
请注意,你是出于正当理由这样做的。
答案 1 :(得分:1)
如上面的示例所指出的,“强制包含”对于预编译的标头可能很有用。
这实际上是cmake的 target_precompile_headers 所做的。 https://cmake.org/cmake/help/git-stage/command/target_precompile_headers.html
在此使用上下文中:
强制包含标头实际上是一个不错的功能,因为它使您可以将预编译标头与MSVC,clang和gcc一起使用,而无需更改源。
这也是一个不错的功能,因为它允许您仅通过更改配置即可打开/关闭PCH(例如,在cmake中)。这使您可以测试是否在没有预编译头的情况下也构建了源代码(例如,对于不支持它的编译器/情境)。例如clang-tidy对PCH感到困惑(至少与MSVC结合使用)。