MinGW二进制3x与MSVC二进制一样大

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

现在,几个星期后,我把所有的东西都编译好了,而且它看起来也很好(单元测试工作,和演示一样)。

但是,我的错误是MinGW二进制文件的大小与MSVC二进制文件相反。 我知道MinGW二进制文件通常要稍微大一点,因为它们必须包含自己的非MS系统库,但我们谈论的是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之间的大小差异并不大。


首先,谁在乎? 你看过这个更大的尺寸来影响性能吗?

其次:你确定你正在静态链接到MSVC吗? 请确保与Dependency Walker确认。

第三:是MinGW GCC编译的二进制文件通常较大。 这是因为MinGW提供了C库的一部分来弥补msvcr *是多么可笑地遵从合规性。 尽管如此,这从来没有表现出很大的差异。

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

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


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

链接地址: http://www.djcxy.com/p/41895.html

上一篇: MinGW binary 3x as big as MSVC binary

下一篇: using msvc lib in mingw