我目前正在移植一个库(不是我自己编写的,我只是#34;只是移植它)才能使用MinGW编译器。图书馆是一个真正的重量级,拥有各种C ++"黑魔法" (多重继承,模板模板模板,宏观重量等)。
现在,经过几个星期,我得到了所有编译好的东西,它似乎运行良好(单元测试工作,演示也是如此)。
但是,与MSVC二进制文件相比,MinGW二进制文件的庞大规模让我感到困惑。我知道由于必须包含自己的非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之间的大小差异不大 。
答案 0 :(得分:1)
首先,谁在乎?你有没有看到这个更大的尺寸影响性能?
第二:您确定要与MSVC静态链接吗?请与Dependency Walker联系以确定。
第三:是的MinGW GCC编译的二进制文件通常更大。这是因为MinGW提供了C库的一部分,以弥补msvcr *在合规方面的破坏程度。这对我来说从来没有表现出很大的差别。
第四:两个编译器之间的模板和内联处理可能不同。
第五:您是否尝试使用-fno-keep-inline-dllexport和/或-Os编译GCC版本?
答案 1 :(得分:0)
我曾经遇到过这个问题,对我而言,结果就是rubenvb建议的 - C / C ++ std库在MinGW中静态链接,但在MSVC中动态链接。我在每个编译的可执行文件/ dll上使用“dumpbin / imports”来确定这一点。如果您没有看到MSVC * .dll作为导入,则静态链接。您可以通过更改Visual Studio中的“运行时库”设置来静态链接MSVC中的std库,这是cl.exe的标志,它是/ MT(用于静态)或/ MD(用于动态)。我认为它默认是动态的。