我正在编译一个主要包含模板类的静态库。当使用 gcc 编译时,生成的 .a 文件大约有 40Mb 标记。这是相当大的,但由于正在进行的模板数量,这并不完全出乎意料。但是,当我使用 VS2005 编译相同的代码时,生成的 .lib 文件进入(等待它!)575Mb..
现在,在我被烧毁之前,我已经看到: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
非常感谢任何意见或指示..
最佳答案
调试版本禁用内联以及丢弃重复代码的链接器选项,因此您可以获得每个模板和内联函数的大量拷贝。
您可以在链接器选项中使用 /OPT:REF/OPT:ICF
启用它。但它应该在发布版本中默认存在。
不幸的是,我认为这只对您的最终可执行文件有帮助,对中间库没有帮助。
您可以通过在一个 .cpp 中显式实例化您需要的模板实例并使用 extern template 来节省一些空间。防止在编译其他源文件时自动实例化。
关于c++ - 使用VS2005编译时静态库文件巨大,使用gcc编译时正常大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5881533/