C++ MSVS,我应该清理哪个文件?(cl错误:D8037)

4
在C++ MSVS2008中工作,我遇到了越来越烦人的问题:断点执行错误的行、无法捕获等。这是一个非常大的工作空间,有数千个文件,所以我“忍受”了它。
我经历了“标准”步骤(清理、“深度”清理、手动删除*.idb,*.pdb,*il*等),这没有解决“断点在错误的行上”的问题,但至少可以编译和运行/调试。
然后,(出于无关原因),我创建了一个命令行程序,发出一个将CPP编译为OBJ的命令,并得到了一个奇怪的错误:
cl : Command line error D8037 : cannot create temporary il file; clean temp directory of old il files

我以前从未听说过这个,所以通过网络搜索找到了微软网站详细介绍该错误:

http://msdn.microsoft.com/en-us/library/bb385201(v=VS.90).aspx

在我的系统中,TMP目录中似乎有太多的_CL_hhhhhhhh.ss文件。经过搜索,我发现在该目录下确切地有6,063个这样的文件,时间跨度大约为一年。
我以前从未听说过这些文件(“临时编译器文件”)。在Microsoft网站上搜索显示,这种错误至少在MSVS 2005、2008和2010中存在。由于它们是“临时”文件,我认为应该有某种“清理”或“回收”算法?
  • 这个限制有多少个_CL_hhhhhhhh.ss文件? (我在一种情况下发现达到6,063时会出现此错误.)

  • 为什么我从EXE中执行“编译”时会看到此错误,而在MSVS IDE内部执行“编译”时不会?(我直接从命令行执行“编译”时也看不到此错误。)

  • 我是否应该定期清理这些文件来对我的开发机进行“维护”?

  • 我还需要考虑寻找和删除哪些其他“cruft”文件吗?

顺便说一下,我知道MSVS项目GUID被缓存在注册表中,以便IDE可以“找到”手动移动以“修复”与其他项目文件的链接/依赖关系的项目文件。如果有人有建议,我想知道如何清除它们。

这确实引出了最终的问题:“使用MSVS在开发机上累积了哪些隐藏的残留物?”

Win7/64,C++ MSVS 2008,NTFS


这些文件的存在对你造成了问题吗?你试图解决什么问题?除非你的磁盘空间非常低,否则没有必要特别关注临时目录中的文件。 - Cody Gray
@Cody,我的磁盘空间很充足,但我无法从 within-an-exe 编译文件(cl 错误 D8037)。 - charley
@Cody,也确认了:手动删除那些文件后,重新构建,我的断点在正确的行上(我一直在尝试修复这个问题好几天了)。 - charley
如果这些文件一直出现并导致问题,你可以添加一个命令在构建后删除它们。 - std''OrgnlDave
2个回答

1

cl.exe 通过 CreateProcess 启动时似乎没有写入权限 解决了你的第二个问题。为什么只有在从 exe 中启动时才能看到它?

很可能是 cl.exe 在其他地方出现了故障。如果您使用 Process Monitor,它将为您提供有关 cl.exe 所做的所有系统调用以及失败原因的良好想法。

在我的情况下,我在调用 CreateProcess 时覆盖了环境变量,并在该过程中重置了 SystemRoot 环境变量。cl.exe 使用它来解析某些系统 dll 的路径,结果永远找不到 dll。

短期修复方法是将“SystemRoot=c:\windows”添加到我传递给 CreateProcess 的环境设置中。

正确的长期修复方法是获取环境变量,解析它们并仅根据需要修改/附加,并将整个环境变量块传递给 CreateProcess。这样,通过 CreateProcess 启动的 cl.exe 将继承您的 exe 启动时使用的环境变量。


1

我不确定你遇到的特定文件是否非常大(超过10,000行),但在MSVS2008下,我曾多次遇到断点在错误行的问题。对我有效的解决方案(并提高了代码的可读性)是将几个函数逻辑上分组成一个类/命名空间,并将它们放入一个新文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接