Visual c++ MinGW二进制文件是MSVC二进制文件的3倍大

Visual c++ MinGW二进制文件是MSVC二进制文件的3倍大,visual-c++,dll,compiler-construction,g++,mingw,Visual C++,Dll,Compiler Construction,G++,Mingw,我目前正在移植一个不是我自己写的库,我只是移植它来使用MinGW编译器。图书馆是一个真正的重量级人物,拥有各种各样的C++黑魔法多重继承、模板模板、非常宏观重等。 现在,几周后,我把所有的东西都编译好了,而且单元测试和演示都很好地工作 然而,让我感到困扰的是,与MSVC二进制文件相比,MinGW二进制文件的绝对大小。我知道,由于必须包含自己的非MS系统库,MinGW二进制文件通常稍大一些,但我们讨论的是MinGW的33MB,而MSVC的13MB。 这就是发布-O3和-s标志版本 这些是我在Min

我目前正在移植一个不是我自己写的库,我只是移植它来使用MinGW编译器。图书馆是一个真正的重量级人物,拥有各种各样的C++黑魔法多重继承、模板模板、非常宏观重等。 现在,几周后,我把所有的东西都编译好了,而且单元测试和演示都很好地工作

然而,让我感到困扰的是,与MSVC二进制文件相比,MinGW二进制文件的绝对大小。我知道,由于必须包含自己的非MS系统库,MinGW二进制文件通常稍大一些,但我们讨论的是MinGW的33MB,而MSVC的13MB。 这就是发布-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。我认为默认情况下它是动态的。

首先,我们的存储库很关心它;特别是当我必须多次重新加载该库时,如果我想更改库本身的某些内容,我不能上载源代码,只能将二进制文件上载到我们自己的repo。我会试试你建议的旗子。看看有没有区别。你说的静态链接MSVC是什么意思?静态链接什么?我正在用这两种方法创建一个动态库。还是说运行时?如果是这样,我认为MSVC的C++运行时不是20MB大,是吗?在GCC案例中,静态链接LBGCC和LIbSTDC++ +,这是一吨代码。如果在MSVC的情况下你不这样做,我甚至不确定你是否可以,比较文件大小是没有意义的。如果不静态链接GCC运行库,会发生什么?使用的标志和删除对运行库的静态链接都节省了1.5 MB。不幸的是,不太令人印象深刻:与解决方案相关的帖子: