微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用基于 boost 的库时,为什么我生成的预编译文件如此之大?

如何解决使用基于 boost 的库时,为什么我生成的预编译文件如此之大?

我正在使用通过 vcpkg 处理的库进行项目。 由于编译时间不是很长,我清理了一些头文件并将项目配置为使用预编译头文件,将 STL 和 vcpkg 头文件放入其中。

我开始遇到臭名昭著的 C1076,C3859 and C1060 errors快速检查生成的 pch 显示我有一个 1.2GB 的大文件......

我使用 /showIncludes 开关运行了一个构建,看起来 spirit-po(我用于翻译的基于 Boost 的库)引用了 2600 多个 Boost 标头。 (我的项目只有 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 依赖项?
还有其他选择吗?

感谢阅读我:)

解决方法

  1. 仅标头库有效,因为这些标头中没有遗漏任何细节。

  2. 预编译头包含翻译单元开始前头的所有编译信息。

  3. 很大一部分(大部分)boost 库只是头文件。雪上加霜的是,它们是高度通用的,这意味着会有许多模板及其实例。

1 + 2 + 3 是完美风暴。如果大小是一个问题,最好的办法是屏蔽标题中的 boost 并将它们包含在主动依赖它们的选定翻译单元中。

,

在进行更多研究时,我发现了以下库:

  • tinygettext :
    + 不依赖于 Boost
    - 需要 Iconv 库才能工作,即使它可以作为 vcpkg 包使用,这对于在 Windows 上运行也不是那么简单
  • spiritless_po
    + 不依赖于 Boost
    + 自包含
    - 与 spirit-po
  • 不兼容

我测试了两个,我必须说最后一个非常适合我的使用,也就是直接使用 po 文件作为翻译... 我想这不是一个适合所有的解决方案,但对于某些人来说可能已经足够了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?