繁体   English   中英

cmake 在每个源文件中包含头文件

[英]cmake include header into every source file

我实际上有一个简单的问题,但找不到答案。 也许你可以指出我的重复。 所以,问题是:是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件,这样就不需要放置 #include foo.h? 谢谢!

CMake 没有针对此特定用例的功能,但正如您所暗示的,GCC 等编译器具有-include标志,其作用就像源文件中存在#include "foo.h" ,并且由于CMake 可以将参数传递给编译器,您可以通过add_definitionsadd_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

对于此使用上下文:

  1. 强制包含头文件实际上是一个不错的功能,因为它允许您在不更改源代码的情况下使用 MSVC、clang 和 gcc 的预编译头文件。

  2. 这也是一个不错的功能,因为它允许您仅通过配置更改(例如在 cmake 中)打开/关闭 PCH。 这允许您在没有预编译头的情况下测试您的源代码构建(例如,对于不支持它的编译器/情况)。 例如 clang-tidy 对 PCH 感到困惑(至少与 MSVC 结合使用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM