C++ 使用VS2005编译时,静态库文件很大;使用gcc编译时,静态库文件大小正常

C++ 使用VS2005编译时,静态库文件很大;使用gcc编译时,静态库文件大小正常,c++,visual-c++,gcc,static-libraries,C++,Visual C++,Gcc,Static Libraries,我正在编译一个静态库,它主要包含模板类。使用gcc编译时,生成的.a文件大约为40Mb。这是相当大的,但并不完全出乎意料,因为大量的模板正在进行。但是,当我使用VS2005编译相同的代码时,生成的.lib文件的大小是575Mb 现在,在我被烧掉之前,我已经明白了:这对于理解模板可能会使libs变大很有用,但是我很难理解为什么两个编译器的输出大小如此不同 与之相对的选项有: (调试) (发布) 非常感谢任何注释或指针。调试构建会禁用内联以及丢弃重复代码的链接器选项,因此您可以获得每个模板和内联函数

我正在编译一个静态库,它主要包含模板类。使用gcc编译时,生成的.a文件大约为40Mb。这是相当大的,但并不完全出乎意料,因为大量的模板正在进行。但是,当我使用VS2005编译相同的代码时,生成的.lib文件的大小是575Mb

现在,在我被烧掉之前,我已经明白了:这对于理解模板可能会使libs变大很有用,但是我很难理解为什么两个编译器的输出大小如此不同

与之相对的选项有: (调试)

(发布)


非常感谢任何注释或指针。

调试构建会禁用内联以及丢弃重复代码的链接器选项,因此您可以获得每个模板和内联函数的大量副本

您可以使用链接器选项中的
/OPT:REF/OPT:ICF
启用它。但是默认情况下,它应该出现在发布版本中

不幸的是,我认为这只对最终可执行文件有帮助,而对中间库没有帮助


通过在一个.cpp中显式实例化所需的模板实例,并使用来防止编译其他源文件时自动实例化,您可能可以节省一些空间。

您正在VS2005上构建调试构建(
/D“\u Debug”
)-这与GCC相同吗?这会有很大的不同。你是对的,的确如此。。VS2005上的发布版本只有350Mb。。不过,这还远远不够小!您是否使用链接时代码生成(LTCG)?这会使静态库非常大,然后优化器会在链接时缩减最终代码。让我们看看gcc和VS2005版本的编译器和链接器开关。不,在静态库编译器设置上不使用整个程序优化,在可执行文件链接器设置上也不使用LTCG。但是,我应该在最初的帖子中提到,当我链接到这个库时,我得到了一个小得多的exe(~20Mb),链接需要很长时间,因为库本身太大了。是的,我肯定会按照这些思路总体上减小大小。。但是我仍然无法理解为什么在没有任何显式实例化或其他编码优化的情况下,gcc会更好…我也是。我想知道它是否与功能级别链接有关(/Gy,由/O2表示)。这是一个很好的优化,但它必须增加目标文件的开销——特别是当您有许多小的内联函数被重复生成时。您可以尝试在发布模式中指定/Gy-以查看是否有任何区别。接受这个答案是最有用的,尽管问题仍然存在。
/Od /D "WIN32" /D "_DEBUG" /D "_LIB" /D "_WIN32_WINNT=0x0500" /D "_MBCS" /Gm /EHsc /RTC1 /MDd /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
/O2 /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WIN32_WINNT=0x0500" /D "_MBCS" /FD /EHsc /MD /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt