Visual C ++ 2010(Express)外部工具命令的问题

时间:2010-06-09 17:24:25

标签: visual-studio-2010 makefile

我在SuperUser上发布了这个...但是我希望SO的专业人士可能对如何解决这个问题有一个好主意....

通常我们在VS 2005 Pro中开发,但我想给VS 2010一个旋转。我们有基于GNU make工具的自定义构建工具,这些工具在创建可执行文件时被调用。

这是我在调用外部工具时看到的错误:

... \ gnu \ make.exe):***无法为cygwin堆提交内存,Win32错误487

需要注意的是,它在VS2005中仍能完美运行,并且可以直接从命令行调用。此外,我的外部工具设置与VS 2005完全相同。

是否有某些设置可能会导致抛出此错误?

2 个答案:

答案 0 :(得分:1)

来自cygwin email lists看起来其他人遇到类似的情况,即使没有通过Visual Studio运行,他们发现解决方案经常与Cygwin的最大内存设置一起使用:< / p>

http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html

(注意:值得reading this conversation,从上面来看,有些值已经完成但没有效果。)

其他人也报告了反病毒软件的问题(建议是出于某种原因从内存中卸载),也可能还有兼容性设置(尝试将其设置为XP),这在某些情况下会影响cygwin。请参阅:http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=377066

对于Visual Studio:您是否使用64位计算机,如果是这样,您通常在64位环境中运行该工具?

我发现因为Visual Studio 2010以32位运行,所以从它启动的工具是作为32位进程启动的(为了很好地说明这一点,添加“cmd”作为工具)。我不确定为什么这不会在2005年受到影响(除非2005让系统启动进程(64位),2010自己处理它(32位))。

答案 1 :(得分:1)

来自problem with heap, win32 error 487

  

每个Cygwin应用程序都有一个特殊的堆   区域用于保存继承的东西   到子进程。例如。所有文件   描述符结构存储在   堆区域(称为“cygheap”)。   cygheap至少有4000个空间   文件描述符结构。但是 -   这是线索 - 这是固定的大小。该   cygheap无法成长。它的大小是   在应用程序开始时保留   并且它的块被提交   需求。

     

出于某种原因你的服务器   应用程序需要所有的cygheap   在描述下运行时的空间   条件。

可能会在Changing Cygwin's Maximum Memory中找到可能的解决方案:

  

Cygwin的堆是可扩展的。然而,   它确实从一个固定的大小开始   尝试扩展它可能会遇到   以前的记忆   由Windows分配。在某些情况下,   这个问题可以通过添加来解决   中的一个条目   HKEY_LOCAL_MACHINE(改变   所有用户的限制)或   HKEY_CURRENT_USER(仅适用于   当前用户)注册表部分。

     

添加DWORD值heap_chunk_in_mb   并将其设置为所需的内存限制   以十进制MB表示。这是优选的   这在Cygwin中使用了regtool   程序包含在Cygwin中   包。 (有关的更多信息   regtool或其他Cygwin工具,   请参阅“Cygwin”一节   实用程序“或使用--help选项   每个工具。)你应该永远   从那以后使用regtool时要小心   损坏您的系统注册表即可   导致系统无法使用。这个   示例将内存限制设置为1024 MB:

regtool -i set /HKLM/Software/Cygwin/heap_chunk_in_mb 1024
regtool -v list /HKLM/Software/Cygwin
     

退出所有正在运行的Cygwin进程和   重启他们。可以分配内存   达到系统交换的大小   空间减去任何大小   运行过程。系统交换   应该至少和。一样大   物理安装的RAM,可以   在系统类别下修改   控制面板。

确保Windows交换文件的最大大小足够大并不会有害。

总结:环境没有为cygwin可执行文件分配足够的堆空间。出于某种原因,VS2010 Express的问题更为严重。您需要修复环境,或使用除cygwin之外的其他Linux端口,或使用Microsoft实用程序。