使用基于 boost 的库时,为什么我生成的预编译文件如此之大?
Why is my generated precompiled file so big when using a boost based library?
我正在处理一个使用通过 vcpkg 处理的库的项目。
由于编译时间不是那么好,我做了一些 headers 清理并将项目配置为使用预编译 headers,将 STL 和 vcpkg headers 放入其中。
我开始 运行 进入臭名昭著的 C1076, C3859 and C1060 errors,对生成的 pch 的快速检查显示我有一个巨大的 1.2GB 文件...
我 运行 使用 /showIncludes 开关构建,似乎 spirit-po,一个基于 Boost 的库,我用于 t运行slations,引用了超过 2600 个 Boost headers。 (我的项目只有 70 个文件,没什么特别的)
它是项目中唯一使用的基于 Boost 的库。
为了确定这是罪魁祸首,我从 pch 中删除了除 spirit-po 文件之外的所有内容:
#pragma warning(push)
#pragma warning(disable : 4267)
#include <spirit_po/spirit_po.hpp>
#pragma warning(pop)
生成的文件仍然有 1GB 大...
调试版和发布版之间的大小没有差异。
对于一个空的 pch 文件,生成的文件大约为 4MB。
假设一个 250MB 的文件被认为是大的,我怎么会得到一个 4 倍大小的文件?
有了 pch 中的那个库,我不再有编译错误,但我不希望将来再次出现这个问题。
我正在使用 Microsoft Visual Studio Community 2019 版本 16.8.4。
我有哪些选择可以改善这种情况?
这可能是 Visual Studio 中的配置错误吗?
我是否必须完全放弃库以删除 Boost 依赖项?
还有其他选择吗?
感谢阅读我:)
Header 只有库可以工作,因为那些 header 中没有遗漏任何细节。
预编译 headers 包含翻译单元开始前 headers 的所有编译信息。
很大一部分(大多数)boost 库只有 header。雪上加霜的是,它们是高度通用的,这意味着将有许多模板及其实例化。
1 + 2 + 3 是完美风暴。如果大小是一个问题,你最好的选择是屏蔽你的 headers 的提升,并将它们包含在积极依赖它们的 select 翻译单元中。
在进行更多研究时,我发现了以下库:
- tinygettext :
+ 不依赖于 Boost
- 需要 Iconv 库才能工作,要使其在 Windows 上工作并不是那么简单,即使它作为 vcpkg 包可用
- spiritless_po
+ 不依赖于 Boost
+ 独立
- 与 spirit-po 不兼容
两个我都测试了,最后一个非常适合我的使用,就是直接使用po文件作为翻译...
我想这不是适合所有的解决方案,但对某些人来说可能就足够了。
我正在处理一个使用通过 vcpkg 处理的库的项目。 由于编译时间不是那么好,我做了一些 headers 清理并将项目配置为使用预编译 headers,将 STL 和 vcpkg headers 放入其中。
我开始 运行 进入臭名昭著的 C1076, C3859 and C1060 errors,对生成的 pch 的快速检查显示我有一个巨大的 1.2GB 文件...
我 运行 使用 /showIncludes 开关构建,似乎 spirit-po,一个基于 Boost 的库,我用于 t运行slations,引用了超过 2600 个 Boost headers。 (我的项目只有 70 个文件,没什么特别的) 它是项目中唯一使用的基于 Boost 的库。
为了确定这是罪魁祸首,我从 pch 中删除了除 spirit-po 文件之外的所有内容:
#pragma warning(push)
#pragma warning(disable : 4267)
#include <spirit_po/spirit_po.hpp>
#pragma warning(pop)
生成的文件仍然有 1GB 大...
调试版和发布版之间的大小没有差异。
对于一个空的 pch 文件,生成的文件大约为 4MB。
假设一个 250MB 的文件被认为是大的,我怎么会得到一个 4 倍大小的文件?
有了 pch 中的那个库,我不再有编译错误,但我不希望将来再次出现这个问题。
我正在使用 Microsoft Visual Studio Community 2019 版本 16.8.4。
我有哪些选择可以改善这种情况?
这可能是 Visual Studio 中的配置错误吗?
我是否必须完全放弃库以删除 Boost 依赖项?
还有其他选择吗?
感谢阅读我:)
Header 只有库可以工作,因为那些 header 中没有遗漏任何细节。
预编译 headers 包含翻译单元开始前 headers 的所有编译信息。
很大一部分(大多数)boost 库只有 header。雪上加霜的是,它们是高度通用的,这意味着将有许多模板及其实例化。
1 + 2 + 3 是完美风暴。如果大小是一个问题,你最好的选择是屏蔽你的 headers 的提升,并将它们包含在积极依赖它们的 select 翻译单元中。
在进行更多研究时,我发现了以下库:
- tinygettext :
+ 不依赖于 Boost
- 需要 Iconv 库才能工作,要使其在 Windows 上工作并不是那么简单,即使它作为 vcpkg 包可用 - spiritless_po
+ 不依赖于 Boost
+ 独立
- 与 spirit-po 不兼容
两个我都测试了,最后一个非常适合我的使用,就是直接使用po文件作为翻译... 我想这不是适合所有的解决方案,但对某些人来说可能就足够了。