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