9

我有一个相当大的C++程序(~11mb exe)在VS2008下编译,并有兴趣看看整个程序优化是否会显着影响其性能。但是,打开整个程序优化和链接时间码生成会导致链接失败,如下所示;整个程序优化在VC2008中失败

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 

看着任务管理器,我可以看到链接器使用越来越多的内存,直到它耗尽和炸弹。编译器运行在带有2GB或RAM和2GB页面文件的XP 32bit上。 WPO仅限于较小的应用程序和/或更大的环境,还是有任何方法让链接器在内存使用方面更加节俭。

n.b.已经转换了预编译头文件,导致编译在链接之前失败,并关闭了调试信息的输出以及可能需要额外资源的其他任何内容。 C1083的帮助表明缺少头文件或文件句柄不足,而不是空间不足。

编辑:得到它在VS2010下工作,尽管没有预编译头,但性能增益并不那么重要。我将独自离开这个选项,直到我转向更强大的VS2010版本的更强大的64位平台。

+6

有趣的问题。什么是可用磁盘空间;你可能跑得低?我发现[Microsoft Connect上的此错误](http://connect.microsoft.com/VisualStudio/feedback/details/581207/visual-studio-2005-sp1-reproducible-linker-error-lkn1257-caused-by-c1083)这似乎符合你的症状。评论说,它已在VS 2010中修复。如果它是一个选项,你可以尝试。 – 2011-03-02 10:09:45

+1

好像是一样的错误。当我有机会时,我会尝试VS2010,并发布我的结果。感谢您的反馈。顺便说一下,可用磁盘空间的负载。 – 2011-03-02 10:33:12

+2

VC2008是一只脆弱的野兽。优化器在某些情况下不起作用,并且看起来像有这种情况。 – 2011-03-02 16:34:18

回答

5

VC2008是一只脆弱的野兽。优化器在某些情况下不起作用,看起来您可能会遇到这种情况。 “不工作”

例子包括

  • 去优化的代码(慢!)
  • 编译器或(更频繁)连接器崩溃
  • 暗纹编译/链接错误信息
  • 不正确的代码执行(这一次是罕见的,但不是未知的)。

实际上,如果你看一下现代优化器使用的一些技巧,它就像它经常使用的那样工作是相当了不起的。复杂性非常惊人。

专门针对巴蒂尔的问题,一些事情,可能会导致错误:

  1. 暗战文件句柄,用于在DOS和早期版本的Windows的一个大问题。你很难在现代Windows版本中看到它。我甚至不确定文件句柄仍然有限制。

  2. 编译器错误可能是无限循环,这意味着没有足够的资源。

  3. 递归包含文件也可能导致类似的情况。你所有的包含文件是否有“#pragma once”或“#if !defined(FOO_INCLUDED)”?

  4. 是否有可能在项目中包含文件TINDoc.obj两次?2008编译器是积极的多线程,并且在尝试访问文件的两个线程之间可能会存在争用。实际上,这可能通过编译器错误发生,即使您没有包含该文件两次。

  5. 如果程序真的实在太大,可以考虑将其分成一个或多个DLL和零星建筑,或分割有争议的源文件分成多个文件在多个阶段编译器。

不要认为,因为它说“没有足够的空间”,必须是原因。一些程序(包括一些编译器)会猜测错误的原因,而不是检查。

可以使用任务管理器或性能监视器,或(我偏好)监视内存的使用情况,把手等Process Explorer

我已经发布的这第一部分为注释(上图),但我的正如Ben(http://stackoverflow.com/users/587803/ben)所建议的那样 - 将其作为一个答案 - 并进行了一些扩展。

+0

好大纲迈克尔,我在所有标题上都使用了'#pragma once',并且正在观看资源图,所以空间错误似乎是合理的。这是一个庞大的代码库,可以生成约11MB的exe文件,并且已经有相当数量的第三方DLL。我使用VS2010得到了整个程序优化的工作,而且在我的情况下它不会有太大的改进,所以我现在就要避免使用这个选项。 – 2011-03-15 11:19:51

3

您可以尝试使用/3G开关启动XP,为链接器提供3GB的地址空间。在Vista/7中,在命令行中使用BCDEDIT /Set IncreaseUserVa 3072可以获得相同的效果。

这有固定的问题为我创建.ilk文件。