繁体   English   中英

有效地共享预编译的标题

[英]Sharing Pre-compiled Headers efficiently

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

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

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

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

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

谢谢!

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

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

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

#ifndef FOO

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM