gpt4 book ai didi

c++ - 高效共享预编译头文件

转载 作者:可可西里 更新时间:2023-11-01 16:48:22 30 4
gpt4 key购买 nike

我有一个被多个项目使用的框架(其中包括几个示例来展示框架的工作原理)。该框架具有核心、图形、物理、图形用户界面等组件。每个组件都是一个单独的库。还有几种配置。

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

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

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

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

谢谢!

Note: To re-iterate and make it clear, so far, I have one solution file that is compiling all the libraries including the shared PCH. Now if I recompile all the samples and projects, they compile in a couple of seconds or more at most. Before, each project would recreate a PCH file. Also, initially I wanted a PCH for each library, but then I found out that a source file cannot use multiple PCH files, so this option was not feasible. Another option is to compile all possible combinations of PCH files, but that is too time consuming and cumbersome and error prone.

最佳答案

听起来大小问题是因为使用了您实际上不需要的 header ,但由于周转更快,在开发时使用这些 header 仍然有意义。

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

#ifndef FOO

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

至于共享多个 .pch 文件: .pch 文件的一个基本限制是每个 .obj 只能使用一个。当然 .pch 文件可以有任意组合的标题。你可以有一个 .pch 用于 core+graphics,一个 .pch 用于 core+physics,core+ai 等。如果没有源文件需要与超过 core+one 的模块“交谈”时间。这对我来说听起来不现实。这样的计划及其变体听起来像是没有实际 yield 的大量重组工作。您不想构建无数种组合并跟踪所有组合。这是可能的,但它不会为您节省时间。

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

关于c++ - 高效共享预编译头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4128974/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com