我有一个框架,该框架正在被多个项目使用(其中包括一些示例以展示该框架的工作原理)。该框架具有核心,图形,物理,GUI等组件。每个组件都是一个单独的库。也有几种配置。
一个主解决方案文件使用所有可能的配置来编译整个项目,以便项目可以使用库。由于很少重新编译框架,特别是由(包括我在内)从事利用该框架的项目的人员重新编译,因此预编译许多 header 是有意义的。
最初,我让每个项目/样本都有用于整个项目的自己的预编译 header 。每次我必须重建相同的pch时(例如,Debug),因此我决定共享PCH将减少冗余PCH编译。到现在为止还挺好。我有一个编译PCH和库的项目。现在,所有后续项目/样本都使用相同的PCH。这已经很好地工作了。
唯一的问题是我看到文件大小增加了。这不是障碍,就好像打算发布使用该框架的项目一样,它可以从共享的PCH中切断自身并自行创建。我这样做是为了快速开发(实际上,我已经创建了一个工具,该工具可为准备好要构建的新项目/示例创建VS项目文件和源文件,并有助于升级使用较旧版本的先前项目框架的版本)。
无论如何,(我认为)文件大小的增加是因为创建共享PCH的独立VS项目文件包括所有库中的所有 header 。 我的问题是我是否可以使用条件编译(#ifndef)减小最终可执行文件的大小?或者也许以某种方式共享多个PCH文件(据我所知,虽然这是不可能的,但我可能是错的)。如果我没有道理,请这么说(用客气:)),因为我对PCH文件的了解非常有限。
谢谢!
最佳答案
听起来大小问题出在使用您实际上不需要的 header ,但是由于更快的周转,在开发时使用这些 header 仍然有意义。
使用#ifndefs在上:预编译是粗糙的。在有区别的地方,您将失去共享预编译工作的能力。如果使用#ifndefs对包含的内容进行不同的修改,即如果你有
#ifndef FOO
然后,预编译头文件必须在使用该预编译头文件的两个文件中以不同的方式定义FOO之前停止。因此,#ifndef不能解决问题。最终结果是FOO必须相同,否则您将返回不同项目的单独pch文件。都不能解决问题。
至于共享多个.pch文件: .pch文件的基本限制是每个.obj只能使用一个。当然,.pch文件可以具有标题的任意组合。您可以为核心+图形设置一个.pch,为核心+物理设置一个.pch,或者为核心+ ai等。如果一个源文件都不需要与一个核心+一个模块“对话”,那么这将只是花花公子。时间。这对我来说听起来不现实。这样的方案和它的变体听起来像是大量的重组工作,没有任何实质性的 yield 。您不想构建成千上万个组合并跟踪所有组合。有可能,但这不会节省您的时间。
在我看来,通过牺牲可执行文件的大小来在开发/调试过程中快速周转,然后采用一种较慢但精简的方式来构建实际发行版,您所做的事情完全正确。
关于c++ - 高效共享预编译的标题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4128974/