[英]cmake include header into every source file
我实际上有一个简单的问题,但找不到答案。 也许你可以指出我的重复。 所以,问题是:是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件,这样就不需要放置 #include foo.h? 谢谢!
CMake 没有针对此特定用例的功能,但正如您所暗示的,GCC 等编译器具有-include
标志,其作用就像源文件中存在#include "foo.h"
,并且由于CMake 可以将参数传递给编译器,您可以通过add_definitions
来add_definitions
。
这个答案涵盖了 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
将减慢编译时间。 如果您确实需要在所有源文件中使用相同的标头(并且它不是系统标头),则这可能是代码中高耦合的征兆。 又有什么好处呢? 不必在文件中添加一行?
但是,有必要注意编译器支持这一点是有原因的; 有一些奇怪的边缘情况(示例 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 结合使用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.