c++ - cmake 将 header 包含到每个源文件中

标签 c++ c cmake

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

最佳答案

CMake 没有针对此特定用例的功能,但正如您所暗示的那样,GCC 等编译器具有 -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 会减慢编译时间。如果您确实需要在所有源文件中使用相同的 header (并且它不是系统 header ),则可能是代码中高耦合的症状。为了什么好处?不必在文件中添加一行?

但是,有必要注意编译器支持它是有原因的;有一些奇怪的边缘情况( example 1example 2 ),这是一件有用的事情。

请注意,您这样做是出于正确的原因。

关于c++ - cmake 将 header 包含到每个源文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32773283/

相关文章:

c++ - 如何使用 C++ 在 gtkmm:gtk::Listbox 中添加文本框

c++ - 为什么 std::fstream 类不采用 std::string?

c++ - 该程序将编译但不运行。其他程序运行

c - 为什么在 C 中使用宏?

c - 像 int *array[99] = {0}, *u 这样的东西是做什么的?

具有预先编译依赖项能力的 C++ 构建系统

c++ - OSX 上的 GLFW + Vulkan

c++ - MsBuild 任务不会将 native C++ 输出放在 TargetOutputs ItemGroup 中

c++ - 找不到 CMake 静态库的依赖项

c - 如何在 Win64 上的 C 中将可变参数与函数指针结合使用?