2011-05-04 46 views
5

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

现在,在我被烧毁之前,我已经看到:How can I get my very large program to link?,这对于了解模板可能会使库很大,但我很难理解为什么两个编译器的输出在大小上如此不同?

VS选项有: (调试)

/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 

任何意见或指针大加赞赏..

+0

您正在VS2005上构建一个Debug版本('/ D“_DEBUG”') - 这和GCC一样吗?这可能会造成相当大的差异。 – 2011-05-04 14:51:01

+0

你是对的,它确实.. VS2005上的发布版本是*仅* 350Mb ..尽管如此,仍然没有足够小! – StevieG 2011-05-04 14:54:27

+0

您正在使用Linktime代码生成(LTCG)吗?这使静态库非常大,然后优化器在链接时缩减最终代码。 – 2011-05-04 14:59:26

回答

3

调试版本禁用内联和也链接器选项,丢弃重复的代码,所以你会得到大量的每个模板和内联函数的副本。

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

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

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

+0

是的,我很肯定按照这些思路来减少一般的尺寸..但仍然无法让我的脑海为什么它在gcc中更好,没有任何明确的实例化或其他编码优化... – StevieG 2011-05-04 16:06:48

+0

我也是。我想知道它是否涉及功能级别的链接(/ Gy,暗示为/ O2)。这是一个很好的优化,但它必须增加目标文件的开销 - 特别是如果您有很多重复生成的小内联函数。你可以尝试指定/ Gy-在发布模式,看看它是否有任何区别。 – 2011-05-04 20:00:31

+0

接受这个答案是最有用的,尽管问题仍然存在。 – StevieG 2012-02-10 12:39:52