Eclipse CDT - 预编译头

时间:2013-04-15 17:08:52

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

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

有什么建议吗?!

4 个答案:

答案 0 :(得分:1)

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

如您所知,您需要为标头编译设置相同的编译器标志,以便让编译器将其用于其他编译单元。 (至少在海湾合作委员会的情况下)。

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

  • 使用自定义脚本替换“属性 - > C / C ++构建 - >构建器设置 - >构建命令”中的默认构建命令,该脚本将修改eclipse生成的makefile,然后调用make。提出了一种红宝石解决方案here。请注意,它不允许使用多个预编译头。
  • 您可以使用ccache代替使用GCC。它会检测何时再次进行相同的编译,因此它与使用预编译的头文件略有不同。

编辑:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

只是帮助那些可能会偶然发现的人(因为我花了一些时间弄清楚这个问题)

要做的第一件事是创建一个带有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 ++ Build>设置>工具设置
编译器>模式:${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,因此在没有.gch的情况下仍需要大约34秒的时间进行编译)

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

如果pch的组织/使用正确(正确选择要包含在其中的标头和文件)(未在每个文件中使用),则它应该比22s快得多。 (此测试只是在不考虑pch的项目上完成的)


可将编译时间增加三倍的附加加速功能
项目>属性> C / C ++构建>行为>启用并行构建

答案 3 :(得分:0)

考虑使用cmakecotire