【问题标题】:MinGW binary 3x as big as MSVC binaryMinGW 二进制文件是 MSVC 二进制文件的 3 倍
【发布时间】:2013-08-07 07:31:10
【问题描述】:

我目前正在移植一个库(不是我自己编写的,我“只是”移植它)以使用 MinGW 编译器。该库是真正的重量级库,拥有各种C++“黑魔法”(多重继承、模板的模板、非常重的宏等)。

现在,几个星期后,我把所有东西都编译好了,而且它似乎也运行良好(单元测试有效,演示也有效)。

不过,让我感到困扰的是 MinGW 二进制文件与 MSVC 二进制文件相比的绝对大小。我知道,由于必须包含自己的非 MS 系统库,MinGW 二进制文件通常稍大一些,但我们谈论的是 MinGW 的 33 MB 和 MSVC 的 13 MB。 这就是“发布”(-O3 和 -s 标志)版本!

这些是我在 MinGW 中编译时使用的标志:

-c -O3 -s -MMD -march=native -frtti

链接器是这样的:

-shared -s -static-libgcc -static-libstdc++ 

我知道 rtti 增加了一些大小,但它也必须在 MSVC 二进制文件中。并且静态 libgcc 和 libstdc++ 库不可能那么大......或者他们可以吗?

我在这里缺少什么?通常,MinGW 和 MSVC 之间的大小差异不会那么大。

【问题讨论】:

标签: visual-c++ dll compiler-construction g++ mingw


【解决方案1】:

首先,谁在乎?您是否看到过这种较大的尺寸会影响性能?

第二:您确定要与 MSVC 进行静态链接吗?请与 Dependency Walker 确认。

第三:是的,MinGW GCC 编译的二进制文件通常更大。这是因为 MinGW 提供了 C 库的一部分来弥补 msvcr* 在合规方面的可笑性。不过,这对我来说从未有太大的不同。

第四:两个编译器之间的模板和内联处理可能不同。

第五:你试过用-fno-keep-inline-dllexport和/或-Os编译GCC版本吗?

【讨论】:

  • 首先,我们的存储库很关心。 ;) 特别是当我必须多次重新上传该库时,我是否应该更改库本身的某些内容(我无法上传源代码,只能将二进制文件上传到我们自己的仓库)。我会试试你建议的标志。看看有没有区别。
  • 静态链接到 MSVC 是什么意思?静态链接什么?我正在用两者创建一个动态库。或者你的意思是运行时?如果是这样,我认为 MSVC 的 c++ 运行时不是 ~20MB 大,是吗?
  • 在 GCC 案例中,您静态链接 libgcc 和 libstdc++,这是大量的代码。如果您在 MSVC 案例中没有这样做(我什至不确定您是否可以),那么比较文件大小是没有意义的。如果不静态链接 GCC 运行时库会发生什么?
  • 使用的标志和删除针对运行时的静态链接节省了 1.5 MB。不太令人印象深刻,不幸的是:(
【解决方案2】:

我曾经遇到过这个问题,对我来说,这正是 rubenvb 所建议的——C/C++ 标准库在 MinGW 中静态链接,但在 MSVC 中动态链接。我在每个编译的可执行文件/dll 上使用了“dumpbin /imports”来确定这一点。如果您没有将 MSVC*.dll 视为导入,则它是静态链接的。您可以通过更改 Visual Studio 中的“运行时库”设置在 MSVC 中静态链接 std 库,这是 cl.exe 的标志,它是 /MT(用于静态)或 /MD(用于动态)。我认为它默认是动态的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2011-08-30
    • 2020-09-25
    • 2021-02-14
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多