4

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

有什么建议么 ?!

4

4 回答 4

2

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

首先要做的是使用 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"

只有在编译文件中首先包含标头时才使用 .ghc。

“在特定编译中只能使用一个预编译头文件。”

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


编译测试

没有预编译头文件
took 34s.189ms output src=2,143,078 bytes exe=1,346,864 bytes

使用 -include ../src/PCH/pch.h (包含在每个编译单元中)(只有 pch.h 而不是 .gch)
took 48s.364ms output src=2,159,431 bytes exe=1,355,298 bytes
(这就是为什么我们在需要的地方手动#include 所以编译仍然需要大约 34 秒没有.gch)

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

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


额外的加速可以使编译时间增加三倍
Project > Properties > C/C++ Build > Behavior > Enable parallel build

于 2018-12-30T08:01:26.607 回答
1

据我所知,目前 Eclipse CDT 不直接支持预编译头文件。我的意思是,你不能设置这样的选项:“对于这个头文件,编译它”。这同样适用于 Eclipse 项目的外部库的标头。

如您所知,您需要为标头编译设置相同的编译器标志,以使编译器将其用于其他编译单元。(至少在 GCC 的情况下)。

所以,你有几个解决方案:

  • 您将在“Properties for -> C/C++ Build -> Builder Settings -> Build command”中找到的默认构建命令替换为自定义脚本,该脚本将修改 eclipse 生成的 makefile,然后调用 make。这里提出了一个红宝石解决方案。请注意,它不允许使用多个预编译头文件。
  • 您可以使用ccache而不是使用 GCC。它检测何时再次完成相同的编译,因此它与使用预编译头文件有点不同。

编辑 :

要使 ruby​​ 脚本正常工作,您需要在与头文件相同的目录中至少有一个 .cpp 文件。否则,您将在丢失文件“subdir.mk”时收到错误消息。

于 2013-05-01T08:06:14.387 回答
1

另一种方法是创建一个源文件(例如 pch.cpp),更改构建设置以创建预编译头文件。它应该包含在构建中以创建预编译头文件,然后将其排除以构建最终的可执行文件。如果头文件发生变化,需要临时重新包含。

该网站提供了更多详细信息,包括为每个构建配置创建不同的预编译头文件的方法。

于 2014-03-08T14:01:28.307 回答
0

考虑使用cmakecotire

于 2017-03-13T09:48:38.900 回答