2013-08-07 77 views
0

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

现在,过了几个星期,我得到的一切都很好地编译,它也似乎很好地工作(单元测试工作,以及演示)。

但是,我发现的错误是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之间的尺寸差异不是大。

回答

1

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

第二:你确定你是静态链接到MSVC吗?请确保与Dependency Walker确认。

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

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

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

+0

首先,我们的存储库关心。 ;)特别是当我不得不重新上传这个库多次时,我是否应该改变库中的某些东西(我无法上传源代码,只是将二进制文件上传到我们自己的回购库中)。我会尝试你建议的标志。看看是否有区别。 – TheSHEEEP

+0

静态链接到MSVC是什么意思?静态链接什么?我正在创建一个动态库和两个。或者你的意思是运行时?如果是这样,我认为MSVC的C++运行时不是〜20MB大,是吗? – TheSHEEEP

+0

在GCC的情况下,您正在静态链接libgcc和libstdC++,这是一大堆代码。如果你在MSVC的情况下没有这样做(我甚至不确定你是否可以),比较文件大小是没有意义的。如果不静态链接GCC运行时库,会发生什么情况? – rubenvb

0

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