9

我有一个被多个项目使用的框架(其中包括几个示例来展示框架是如何工作的)。该框架具有核心、图形、物理、gui 等组件。每个组件都是一个单独的库。也有几种配置。

主解决方案文件使用所有可能的配置编译整个项目,以便项目可以使用库。由于该框架很少被重新编译,尤其是有人(包括我)在使用该框架的项目上工作,因此预编译许多头文件是有意义的。

最初,我让每个项目/样本都有自己的用于整个项目的预编译头文件。每次我都必须重建相同的 pch(例如,Debug),所以我决定共享 PCH 将减少冗余 PCH 编译。到现在为止还挺好。我有一个将 PCH 与库一起编译的项目。所有后续项目/示例现在都使用相同的 PCH。这非常有效。

唯一的问题是我看到文件大小增加了。这不是障碍,就像使用该框架的项目打算发布一样,它可以将自己从共享 PCH 中分离出来并自己制作。我这样做是为了快速开发(我实际上创建了一个工具,它为准备构建的新项目/示例创建 VS 项目文件和源文件,并促进升级使用旧项目的先前项目框架的版本)。

无论如何,(我假设)文件大小的增加是因为创建共享 PCH 的独立 VS 项目文件包含来自所有库的所有头文件。我的问题是我是否可以使用条件编译(#ifndef)来减小最终可执行文件的大小?或者可能以某种方式共享多个 PCH 文件(据我所知,这是不可能的,但我可能错了)如果我没有意义,请说出来(用客气的话 :))因为我对 PCH 文件的了解非常有限.

谢谢!

注意:为了重新迭代并说明清楚,到目前为止,我有一个解决方案文件正在编译包括共享 PCH 在内的所有库。现在,如果我重新编译所有示例和项目,它们最多可以在几秒钟或更长时间内编译。以前,每个项目都会重新创建一个 PCH 文件。另外,最初我希望每个库都有一个 PCH,但后来我发现一个源文件不能使用多个 PCH 文件,所以这个选项不可行。另一种选择是编译所有可能的 PCH 文件组合,但这太耗时、繁琐且容易出错。

4

2 回答 2

1

听起来大小问题来自使用您实际上并不需要的标头,但由于更快的周转速度,在开发时使用这些标头仍然有意义。

关于使用#ifndefs:预编译很粗糙。您失去了在有差异的地方共享预编译工作的能力。如果使用#ifndefs 来制作你所包含的不同变体,即如果你有

#ifndef FOO

然后,预编译头文件必须在使用该预编译头文件的两个文件中以不同方式定义 FOO 的点之前停止。所以#ifndef 不会解决问题。最终结果是 FOO 必须相同,否则您将返回为不同项目使用单独的 pch 文件。两者都解决不了问题。

至于共享多个 .pch 文件: .pch 文件的一个基本限制是每个 .obj 只能使用一个。当然 .pch 文件可以有任意的标题组合。你可以有一个 .pch 用于 core+graphics,一个 .pch 用于 core+physics,core+ai 等。如果没有任何源文件需要在时间。这对我来说听起来不现实。这样的计划及其变体听起来像是大量的重组工作而没有真正的收益。您不想构建数以万计的组合并跟踪它们。这是可能的,但它不会节省您的时间。

在我看来,通过在开发/调试期间牺牲可执行文件大小以实现快速周转,然后为实际版本构建更慢但更精简的方式,您正在做完全正确的事情。

于 2010-12-07T13:20:18.873 回答
0

在过去,我发现当您在预编译的标头中添加更多内容时,您很快就会遇到收益递减,因此如果您尝试添加更多内容以使其在更多项目中更有用,那么它将达到指出它变慢了。在我们的项目中,PCH 文件的编译时间比大多数源文件要长,但最多也只有几秒钟。我建议将 PCH 文件制作成特定于您正在使用的每个项目。您说得对,源文件只能引用单个 PCH 文件,但解决此问题的一种方法是使用“强制包含”选项(我认为在“高级”选项卡中)以确保所有文件都包含 PCH该项目的文件。

于 2010-11-08T23:21:11.767 回答