Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 高效共享预编译头_C++_Visual Studio 2008_Precompiled Headers - Fatal编程技术网

C++ 高效共享预编译头

C++ 高效共享预编译头,c++,visual-studio-2008,precompiled-headers,C++,Visual Studio 2008,Precompiled Headers,我有一个框架,几个项目正在使用它(其中包括几个示例来展示框架是如何工作的)。该框架包含核心、图形、物理、gui等组件。每个组件都是一个单独的库。还有几种配置 主解决方案文件将编译完整的项目以及所有可能的配置,以便项目可以使用这些库。由于框架很少被重新编译,特别是由使用该框架的项目的工作人员(包括我)重新编译,因此预编译多个头是有意义的 最初,我让每个项目/示例都有自己的预编译头,用于整个项目。每次我都必须重建相同的pch(例如,调试),因此我决定使用共享pch来减少冗余pch编译。到现在为止,一

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

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

最初,我让每个项目/示例都有自己的预编译头,用于整个项目。每次我都必须重建相同的pch(例如,调试),因此我决定使用共享pch来减少冗余pch编译。到现在为止,一直都还不错。我有一个项目,将PCH与库一起编译。所有后续项目/样本现在都使用相同的PCH。这已经非常有效了

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

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

谢谢

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


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

听起来大小问题来自于使用不需要的标题,但是,在开发时使用这些头文件仍然是有意义的,因为这样可以更快地完成任务

上使用#ifndefs:预编译是粗糙的。您将无法在存在差异的地方共享预编译工作。如果使用#ifndefs对您包含的内容进行不同的变体,即

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

至于共享多个.pch文件:一个基本的.pch文件限制是每个.obj只能使用一个。当然.pch文件可以有任意的头文件组合。你可以用一个.pch表示core+图形,一个.pch表示core+物理,core+人工智能等。如果没有任何源文件需要一次与多个core+模块“对话”,那么这将非常有效。对我来说,这听起来不现实。这样一个计划和它的变体听起来像是为了没有实际收益而进行的大量重组工作。你不想建立无数的组合并跟踪它们。这是可能的,但它不会节省你的时间

在我看来,在开发/调试过程中,牺牲可执行文件的大小来实现快速转换,然后采用一种更慢但更精简的方式来构建实际版本,这样做是完全正确的

请投赞成票: