Visual Studio警告有关具有不同内容的文件的副本

Bra*_*van 37 c++ visual-studio

当我在Visual Studio中调试我的C++项目时,弹出一个警告对话框,告诉我:

A copy of datum.h was found in
c:/users/brad/desktop/source/binary/datum.h, but the current
source code is different from the version built into
c:/users/brad/desktop/source/binary/datum.h.
Run Code Online (Sandbox Code Playgroud)

我很难理解这甚至试图告诉我什么,更不用说如何解决它了.起初我以为可能会抱怨我不小心复制了目录中的一个文件,我查了一下这个文件,并没有发现任何类型,这让我很难过.我也尝试从解决方案中排除该文件并再次添加它,这也没有解决问题.

警告似乎并没有真正阻碍我的项目的发展,但我认为警告存在是有原因的,所以如果有人知道出了什么问题,任何建议都会非常感激.据我所知,我没有改变任何东西导致消息出现,它只是弹出一次我去调试解决方案并一直出现.

此外,相同警告的更多副本已经开始弹出,与我的解决方案中的其他头文件有关(我还没有收到任何有关.cpp文件的信息,但这可能是巧合,因为它只是持续大约20个分钟).

Gre*_*reg 27

尝试从相关文件中删除断点.当Visual Studio 2013出现在调试版本中的头文件时,这对我有用. 来源:发布模式文件同步问题 - 当前源代码与构建的版本不同

附加说明:清理/重建也有效,但这对于定期更改代码很痛苦.启动调试器后启用断点只会延迟消息.

  • 即使在彻底重建之后,这种情况仍然会发生。这是 VS 2015 的情况。我的猜测可能是调试器和编译器在如何散列换行符或类似的问题上存在分歧?修复方法是在“调试”->“选项”->“调试”->“常规”中关闭“要求源文件与原始版本完全匹配” (2认同)
  • 我在.H文件中有断点(在内联函数上设置),在VS2013中运行调试器.我删除了断点,并且不再出现唠叨消息. (2认同)
  • 所有这些所做的都是隐藏问题,它仍然出现,您仍然无法逐步解决它......-1 (2认同)

Use*_*erX 13

我解决了它:

  1. 如果它已打开,请关闭Visual Studio中.h文件的窗口.
  2. 关闭Visual Studio.
  3. 从正常位置剪切.h文件并将其粘贴到VS不知道的临时文件夹中.
  4. 重启VS并编译.它会抱怨丢失的.h文件.好 - 让那个混蛋乞求它!
  5. 将.h文件粘贴回原始位置.
  6. 编译.VS会感激地接受丢失的文件.(该死的我讨厌微软!)

  • 这仍然不能防止问题再次发生(即下次编辑文件时仍然会发生)。 (2认同)

Meh*_*dad 9

如果将实现文件(*.c、*.cpp 等)重命名为头文件,则会发生这种情况。

这是因为项目类型仍然保留为C/C++ Source File,使其被编译为单独的翻译单元而不是实际的标头,从而阻止 Visual Studio 将其识别为其他地方的标头。

我花了很长时间才弄清楚这一点。

要解决此问题:

  1. 在“解决方案资源管理器”中右键单击头文件,然后选择“属性”。

  2. 选择所有配置所有平台

  3. 在常规下,将项目类型更改为C/C++ Header

  4. 按确定。

  5. 强制重新编译#include属于您的标头(或只是Rebuild解决方案)的任何文件。


Jon*_*tte 5

问题在于调试器认为源文件的校验和与编译器计算并放入其中的校验和不同。然后,调试器将拒绝在不匹配的文件中应用断点,以防止您看到它无法保证正确的数据。

即使在彻底重建之后,这种情况仍然会发生。这是 VS 2015 的情况。我的猜测可能是调试器和编译器在如何散列换行符或类似的问题上存在分歧?修复方法是在“调试”->“选项”->“调试”->“常规”中关闭“要求源文件与原始版本完全匹配”


Rud*_*lis 2

您是否有可能正在调试另一个可执行文件(不是实际构建的?)。在 Visual Studio 在一个目录中生成二进制文件,然后将它们复制到其他目录进行调试的情况下,这是一个常见问题。我建议您比较 Visual Studio 中调试设置下的目标路径和常规设置下的输出目录。

目标路径

这可以解释这个问题,因为您实际上正在调试一些旧版本的二进制文件(不是当前构建的版本),因此会出现警告,因为 Visual Studio 无法找到该版本的二进制文件的源文件版本。

  • 我通过对解决方案运行 Clean 操作设法使警告消失。我不确定该操作的语义,所以我想它会执行类似于您建议的操作。感谢您的回复:) (2认同)