c++ - Eclipse CDT - 预编译 header

标签 c++ eclipse eclipse-cdt precompiled-headers

我正在寻找一种直接的方法来使用 Eclipse/CDT 为 C++ 项目使用预编译头文件。这些东西在从命令行运行时确实有效,但我正在寻找一种将其集成到 Eclipse 中的简单方法。

有什么建议吗?!

最佳答案

只是为了帮助其他可能偶然发现这一点的人(因为我花了一些时间来解决这个问题)

首先要做的是使用 pch.cpp 和 pch.h 文件创建一个 PCH 文件夹(如果需要)。

pch.cpp:(这个文件是用来编译.gch的)

#include "pch.h"

pch.h:

#include <iostream>
#include <string>
// more stuff that's not changing anytime soon...

要做的第二件事是创建 PCH 构建配置。

从这个构建中排除所有项目源文件。 (我们只需要编译pch.cpp)
选择文件/文件夹 > 右键单击​​ > 资源配置 > 从构建中排除 > PCH

现在我们需要将其编译为.gch(预编译头文件)
pch.cpp > 右键单击​​ > 属性 > C/C++ 构建 > 设置 > 工具设置
编译器 > 模式:${COMMAND} ${FLAGS} ${INPUTS}(删除所有输出内容)
其他 > 标志:-c -x c++-header -o "../src/PCH/pch.h.gch"

现在,当您使用此配置构建时,它将在 pch.h 所在的位置生成 pch.h.gch。
(它还会在尝试创建 exe 时出现无意义的错误。忽略它即可)


回到正常的 Release 构建,排除 pch.cpp,因为您不需要编译它。

现在是时候测试 .gch 是否在 .h 上使用了

在 pch.h 的顶部放置 #error "not using precompiled header file"

只有在编译文件中首先包含 header 时,才会使用 .ghc。

"Only one precompiled header can be used in a particular compilation."

您应该预编译最适合不同编译单元的不同头文件选择


编译测试

没有预编译头文件
花费 34s.189ms 输出 src=2,143,078 字节 exe=1,346,864 字节

with -include ../src/PCH/pch.h(包含在每个编译单元中)(只有 pch.h 而不是 .gch)
花费 48s.364ms 输出 src=2,159,431 字节 exe=1,355,298 字节
(这就是为什么我们在需要的地方手动 #include,这样在没有 .gch 的情况下编译仍然需要大约 34 秒)

使用 -include ../src/PCH/pch.h 和 pch.h.gch(快速编译,但使用 -include 仍然效率低下)
花费 22s.535ms 输出 src=2,159,431 字节 exe=1,355,298 字节

如果 pch 的组织/使用得当(正确选择 header 和文件以包含它们)(不是在每个文件中都使用)它应该比 22s 快得多。 (这个测试只是在一个没有考虑到 pch 的项目上完成的)


额外的加速可以使编译时间增加三倍
项目 > 属性 > C/C++ 构建 > 行为 > 启用并行构建

关于c++ - Eclipse CDT - 预编译 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16020869/

相关文章:

c++ - 如何从 Boost::GIL View 类型中提取 channel 类型?

java - 在 Eclipse 中检查匿名类之外的变量

c - eclipse /GDB : How to set an automatic breakpoint after hardware reset?

c++ - Eclipse 卡住长文件中的打开声明

c++ - 调用 Eclipse CDT 生成的 makefile 的外部 makefile - 根据 Debug\Release 配置

c++ - 我怎样才能结交 AND TEST CLASS(SomeTest ClassName) friend

c++ - 如何为不同的 HRESULT 值正确使用 On Error Goto

c++ - 调节后检索/调试当前 FPS?

java - 在 Eclipse 插件中实现 "search"功能

java - SWT 文本小部件不显示