c++ - 使用VS2005编译时静态库文件巨大,使用gcc编译时正常大小

标签 c++ visual-c++ gcc static-libraries

我正在编译一个主要包含模板类的静态库。当使用 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/

相关文章:

java - 大括号使得 for 循环只运行一次?

c# - 映射平台特定的互操作类型

c++ - 如何从 boost::ptr_vector 中删除 "this"

visual-studio - 获取文件的父目录作为字符串c++

c++ - 如果将对象创建为引用,为什么即使基类析构函数不是虚拟的,派生类析构函数也会被调用

c - 将值从 Assembly 传递到 C

c++ - 为什么 gcc 认为我试图在我的模板函数签名中进行函数调用?

模板中的 C++ 数据类型

visual-c++ - 是否可以告诉编译器(msvc、gcc)单独保留特定寄存器?

c - 默认链接的库