2010-11-08 116 views
9

我有一个框架正在被几个项目(包括几个样本来显示框架如何工作)使用。该框架包含核心,图形,物理,GUI等组件。每一个都是独立的库。还有几种配置。高效共享预编译头文件

主要解决方案文件使用所有可能的配置编译完整项目,以便项目可以使用这些库。由于框架很少被重新编译,尤其是有人(包括我)正在开发一个利用框架的项目,所以预编译多个头文件是很有意义的。

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

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

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

谢谢!

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

+2

,请投票给本:http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4931119-allow-precompiled-headers-to-be-shared-between-pro – 2013-11-08 09:26:34

回答

1

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

使用#ifndefs:预编译很粗糙。您会失去分享预编辑工作的能力。如果使用#ifndefs来创建你所包含内容的不同变体,即,如果你有

#ifndef FOO 

然后预编译头必须在foo是使用该预编译的头两个文件中定义的不同点之前停止。所以#ifndef不会解决问题。最终的结果是FOO必须是相同的,或者你回来分开不同项目的pch文件。既不能解决问题。

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

在我看来,你的开发/调试过程中牺牲了快速可执行文件的大小掉头,然后有建设的实际释放的速度较慢,但​​更精简的方式做完全正确的事情。

0

在过去,我发现,你很快遇到报酬递减,你把更多的预编译头,所以如果你试图把更多的,使之更加有用在较大数量的项目,那么它会降低速度。在我们的项目中,PCH文件比大多数源文件编译时间要长,但仍然只有最多几秒钟。我建议制作特定于您正在使用的每个项目的PCH文件。您说的源文件只能引用一个PCH文件是对的,但解决此问题的一种方法是使用'force include'选项(在我认为的高级选项卡中)来确保所有文件都包含PCH该项目的文件。