有效地共享预编译的标题

时间:2010-11-08 22:58:51

标签: c++ visual-studio-2008 precompiled-headers

我有一个框架,正在被几个项目使用(其中包括几个示例以显示框架的工作原理)。该框架具有核心,图形,物理,gui等组件。每个组件都是一个单独的库。有几种配置。

主解决方案文件使用所有可能的配置编译整个项目,以便项目可以使用这些库。由于框架很少被重新编译,特别是由某人(包括我)处理使用该框架的项目,因此预编译许多标头是有意义的。

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

唯一的问题是我看到文件大小增加了。这不是障碍,就好像要发布使用该框架的项目一样,它可以将自己从共享的PCH中切断并自行创建。为了快速开发,我已经这样做了(我实际上已经创建了一个工具,可以为新项目/样本创建VS项目文件和源文件,以便于构建以及升级以前使用旧版本的项目框架的版本)。

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

谢谢!

  

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

2 个答案:

答案 0 :(得分:1)

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

上使用#ifndefs:预编译很粗糙。您无法在存在差异的位置共享预编译工作。如果使用#ifndefs来制作你所包含的内容的不同变体,即。如果你有

#ifndef FOO

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

至于共享多个.pch文件: .pch文件的一个基本限制是每个.obj只能使用一个。当然.pch文件可以有任意组合的标题。你可以拥有一个核心+图形的.pch,一个核心+物理的核心,核心+ ai等。如果没有一个源文件需要与一个核心+一个模块进行“交谈”,这样就可以了。时间。这对我来说听起来不太现实。这样的计划和变体听起来像很多重组工作,没有真正的收获。您不希望构建数以万计的组合并跟踪它们。这是可能的,但它不会节省你的时间。

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

答案 1 :(得分:0)

过去我发现当你在预编译的头文件中放入更多内容时,很快就会遇到收益递减的情况,所以如果你想要投入更多资金以使它在更多的项目中更有用,那么它将达到减速的程度。在我们的项目中,PCH文件比大多数源文件需要更长的时间来编译,但仍然只有几秒钟。我建议制作特定于您正在使用的每个项目的PCH文件。你是对的说源文件只能引用一个PCH文件,但解决这个问题的一种方法是使用'force include'选项(我认为在Advanced选项卡中)以确保所有文件都包含PCH该项目的文件。