8

我在一个大量使用预编译头文件的项目中使用 Visual C++ 2012。如此沉重以至于臭名昭著的/Zm开关正在使用中。

当我取消正在进行的构建时,有时会在下一次构建时收到此错误:

error C1852: 'foo.pch' is not a valid precompiled header file

十分之九,事情会顺利进行,但是当发生这种情况时,我必须找到 .pch 并在重新启动构建之前手动删除它。

这让我有点恼火。有没有办法防止这种情况发生?微软的补丁?还是一种强制 Visual 删除 .pch 并在问题发生时自动重新启动构建的方法?还是我没有想到的其他解决方案?

编辑:这是我正在运行的 Visual 版本:

Microsoft Visual Studio Professional 2012
Version 11.0.61030.00 Update 4
4

3 回答 3

1

我将创建一个脚本来尝试重新编译该stdafx.cpp文件,但这次使用 PCH 而不是生成它。即预期的结果是成功编译一个空文件。如果失败,请删除 PCH。现在将此脚本作为预构建步骤运行。

这听起来相当昂贵,但它非常可靠。加载 PCH 的任何问题都会导致其重新生成,甚至编译器升级。此外,您的 PCH 现在位于文件缓存中,这意味着实际使用会稍微便宜一些。

这可以实现为具有一些不寻常规则的 NMAKE 构建脚本。

于 2014-01-15T10:37:10.730 回答
1

这是一个纯粹的猜想,因为我没有遇到这个问题。

尝试找出 Visual 如何检测 .pch 文件已损坏(即空文件、文件未正确结束……)。如果它遵循明确的模式,请编写一个解析所有 .pch 并删除损坏的预构建脚本。

于 2014-01-15T10:22:52.873 回答
0

我按照 Rockeye 的建议尝试在这些损坏的文件中查找模式。事实证明这很简单:有效文件以VCPCH0标题开头,损坏的文件则没有。

一个简单的 C# 程序作为失败项目的预构建事件运行并删除损坏的文件可以解决问题。如果有人感兴趣,来源就在这里

于 2014-10-15T17:12:54.760 回答