我正在编译一个主要包含模板化类的静态库。当使用gcc编译时,生成的.a文件大约是40Mb标记。这是相当大的,但由于模板量的增加,并不完全出乎意料。但是,当我使用VS2005编译相同的代码时,生成的.lib文件正在进入(等待它!)575Mb ..
现在,在我被烧毁之前,我已经看到:How can I get my very large program to link?这对于理解模板可能使libs变大很有用,但是我很难理解为什么两个编译器的输出是这样的大小不一?
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 :(得分:3)
调试版本禁用内联以及丢弃重复代码的链接器选项,因此您可以获得每个模板和内联函数的大量副本。
您可以在链接器选项中使用/OPT:REF /OPT:ICF
启用它。但它应该在发布版本中默认存在。
不幸的是,我认为这只会对您的最终可执行文件有所帮助,而不是中间库。
您可以通过在一个.cpp中显式实例化所需的模板实例来节省一些空间,并在编译其他源文件时使用extern template来阻止自动实例化。