Sma*_*acL 9 c++ linker-errors visual-studio-2008 visual-studio visual-c++
我有一个相当大的C++程序(~11mb exe)在VS2008下编译,并有兴趣看看整个程序优化是否会显着影响其性能.但是,打开整个程序优化和链接时间代码生成会导致链接失败,如下所示;
1>c:\cpp\Win32\Atlas\tin\TINDoc.Cpp : fatal error C1083: Cannot open compiler intermediate file: '.\releaseopt\TINDoc.obj': Not enough space
1>LINK : fatal error LNK1257: code generation failed
Run Code Online (Sandbox Code Playgroud)
看看任务管理器,我可以看到链接器使用越来越多的内存,直到它耗尽并爆炸.编译器在XP 32bit上运行,带有2GB或ram和2gb页面文件.WPO仅限于较小的应用程序和/或更大的环境,还是有任何方法可以让链接器在内存使用方面更加节俭.
nb已经转换了预编译的头文件,导致编译在链接之前失败,并关闭调试信息的输出以及可能需要额外资源的任何其他内容.C1083的帮助表明缺少头文件或文件句柄不足而不是空间不足.
编辑:在VS2010下工作,尽管没有预编译头,但性能提升并不那么重要.我将单独留下这个选项,直到我使用更强大的VS2010版本进入更强大的64位平台.
VC2008是一个脆弱的野兽.优化器在某些情况下不起作用,看起来您可能有一个这样的情况.
"不工作"的例子包括
实际上,如果你看一下现代优化器使用的一些技巧,它的工作频率和它一样频繁.复杂性非常惊人.
特别针对Shane的问题,一些可能导致错误的事情:
耗尽文件句柄曾经是DOS和早期Windows版本中的一个大问题.在现代Windows版本中你几乎没有看到它.我甚至不确定文件句柄是否仍有限制.
编译器错误可能正在进行无限循环,这意味着没有多少资源就足够了.
递归包含文件也可能导致类似的事情.您的所有包含文件都有" #pragma once"或" #if !defined(FOO_INCLUDED)"吗?
您是否有可能在项目中包含文件TINDoc.obj两次?2008编译器是多线程的,并且在尝试访问该文件的两个线程之间可能存在争用.实际上,这可能通过编译器错误发生,即使您没有包含该文件两次.
如果程序真的是太大,可以考虑将其分成一个或多个DLL和零星建筑,或分割有争议的源文件分成多个文件在多个阶段编译器.
不要假设,因为它说"没有足够的空间"必须是原因.某些程序(包括一些编译器)会猜测出错的原因,而不是检查.
您可以使用任务管理器或perfmon或(我的首选项)Process Explorer监视内存,句柄等的使用
我已经将这个的第一部分作为评论(上图)发布了,但我正如Ben(http://stackoverflow.com/users/587803/ben)所建议的那样做出答案 - 并对其进行了一些扩展.
| 归档时间: |
|
| 查看次数: |
3191 次 |
| 最近记录: |