我目前正在将大型RAD Studio 2010项目迁移到XE4。作为其中的一部分,我正在重新创建许多项目文件。我想借此机会确保我们为预编译头文件使用最好的机制,因为似乎有几种方法可以做到。
目前我们只编译32位,但将来会使用64位编译器。
以下是我们目前在2010年所做的工作,以及为什么我不确定在XE4中该做些什么:
我们有一个文件PchApp.h
,其中包含<vcl.h>
和许多其他常用的头文件,主要是项目中各种常用核心类的标题。此标头包含在每个CPP文件的顶部,后跟#pragma hdrstop
,如下所示:
// Top of .cpp file
#include "PchApp.h"
#pragma hdrstop
// Normal includes here
#include "other.h"
#include "other2.h"
// etc
然后,我们在项目选项的预编译标题部分中进行以下设置:
编译速度不是特别快(大约350,000行代码需要12分钟。)我不确定:
换句话说,我不确定这些是正确的还是最佳的设置,但是从阅读the documentation开始,我同样不确定哪些更好。我知道我不能很好地理解所有选项 - 这个问题的一个原因是:)
XE4 32位编译器选项对话框是相同的,但有两件事让我感到困惑和/或让我不确定当前的2010方法是最好的。
1。默认行为
创建新的VCL Forms项目时,IDE会创建标题named by default Project1PCH1.h, which is intended to be the project's precompiled header.此标题包含<vcl.h>
和<tchar.h>
,并在项目管理器中显示为节点。它不包含在默认的Form1.cpp中,但#include <vcl.h>
后跟#pragma hdrstop
位于Form1.cpp的最顶端,后跟其他标题。
使用此标题的新项目的默认XE4设置对话框是:
我(天真地?)正在假设默认值实际上是最佳/最佳设置。有些事情让我困惑:
Project1PCH1.h
未在任何地方的预编译标题设置中提及。Project1PCH1.h
吗?)Project1PCH1.h
。实际上我不知道编译器或IDE实际上是如何知道它应该使用Project1PCH1.h
或者它应该使用它的.cpp文件,因为它没有被引用我能找到的任何方式。
对我来说,这是最令人费解的事情,并且提出这个问题,并清除我对PCHes的困惑。我曾计划复制/使用IDE的默认设置,但在我明白他们在做什么之前我不想这样做。
2。 PCH向导
自2010年以来,IDE已包含预编译头向导。我还没有能够让它工作 - 我现在正在再次运行它以获得结果并解释我对#34;没有工作的记忆,但它似乎需要几个小时,所以我稍后会更新这个问题。
编辑:它运行,虽然它需要几个小时,并产生一个列表(对我来说,知道源基础)奇数标头。我几年前尝试它的回忆是它根本没有运行 - 这是一个明显的改进。
由于它存在,因此可能是在为升级2010项目而形成的新创建的项目文件中设置使用预编译头的最佳方法。我该如何做到最好?包括PchApp.h在内的所有.cpp文件是否会混淆它?
以此为背景,我有以下问题:
我正在寻求一个清晰,详细,解释性和指导性的答案,这个答案清楚地解释了最好的答案 练习,设置选项,包含在.cpp中的项目 文件,标题和/或项目文件,等等 - 换句话说,现在要清理我的东西(毕竟以上!)相当混乱的理解。今后其他C ++ Builder用户可以将其作为首选PCH参考的高质量答案将非常出色。 我打算在中添加赏金 我能够的几天。
答案 0 :(得分:1)
答案 1 :(得分:1)
这就是我的所作所为(虽然我不确定这是不是一个好主意,但似乎有效)
#pragma hdrstop
和2个尾随换行符(当我没有尾随换行符时,我得到了奇怪的错误,可能是编译器错误)#include "PchApp.h"
或#pragma hdrstop
等任何操作。当它在32位模式下正常工作时,一切都能快速编译;你可以告诉你,如果你正在编译你的项目并且一个特定的.cpp文件比其他文件需要更长的时间,你是否还没有完全正确。该向导根据包含给定标题的文件数量提出建议,但这有点虚假;你需要在其中包含任何系统头(或升级头等),如果它不是PCH的一部分,它将显着增加编译时间。
我不打算在其中包含我自己的项目标题,只包括系统和标准标题。根据您的项目IDK,这可能会有所不同。
PCH不适用于.c
个文件,因此如果您的文件中有任何文件,则需要让Project1PCH1.h拥有#ifdef __cplusplus
个警卫。
另外:即使bcc64不支持PCH(但它确实注入了文件),如果你的PCH设置正确,它似乎确实使编译速度提高了一点,我不确定为什么
我还不了解的事情: