2

我目前正在移植一个库(不是我自己编写的,我“只是”移植它)以使用 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 之间的大小差异并没有那么大。

4

2 回答 2

0

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

于 2013-08-08T14:42:42.363 回答
0

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

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

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

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

第五:您是否尝试过使用-fno-keep-inline-dllexport 和/或-Os 编译GCC 版本?

于 2013-08-07T10:04:16.423 回答