【问题标题】:Visual Studio warning about copies of files with different contents关于具有不同内容的文件副本的 Visual Studio 警告
【发布时间】:2015-04-28 08:08:13
【问题描述】:

当我在 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.

我无法理解这甚至试图告诉我什么,更不用说如何解决它了。起初我以为可能是抱怨我​​不小心复制了目录中的一个文件,我检查了它,但没有发现任何类似的东西,这让我很困惑。我还尝试从解决方案中排除该文件并再次添加它,这也没有解决问题。

警告似乎并没有真正阻碍我的项目的开发,但我认为警告的存在是有原因的,所以如果有人知道出了什么问题,任何建议都将不胜感激。据我所知,我没有进行任何更改以导致消息出现,它只是在我去调试解决方案时弹出,并且从那以后一直出现。

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

【问题讨论】:

  • 嗯,很有趣。我在谷歌上没有找到任何东西。您搜索了什么?
  • 文字消息(当然,省略特定的文件和变量名)通常是最好的选择。在这种情况下,我搜索了"but the current source code is different from the version built into"
  • 本站甚至还有two results,但要找到它们,您需要省略“但是”,因为两位发帖者都懒得贴完整消息:1, @987654325 @.
  • 在我的情况下,我的解决方案中有多个项目,在从编辑器启动新项目文件之前,我忘记更改解决方案资源管理器中的 启动项目。这两个项目具有相同的MainWindow 类(在屏幕上看不到区别)。 VS 正在将编辑器中的文件(属于新项目)与存储在旧项目中的文件进行比较,旧项目仍然是启动项目,并且是实际启动的文件。

标签: c++ visual-studio


【解决方案1】:

尝试从相关文件中删除断点。 当 Visual Studio 2013 在调试版本中出现头文件时,这对我有用。 Source: Release mode file sync issue - current source code different from the version built

附加说明:Clean / Rebuild 也可以,但是对于定期更改代码来说这很痛苦。在启动调试器后启用断点只会延迟消息。

【讨论】:

  • 即使在干净的重建之后,我也一直在发生这种情况。这是VS 2015。我的猜测可能是调试器和编译器不同意如何散列换行符或类似的东西?修复方法是在 Debug -> Options -> Debugging -> General 中关闭“要求源文件与原始版本完全匹配”
  • 我在 .H 文件中有断点,它正在咆哮(在内联函数上设置),在 VS2013 中运行调试器。我删除了断点,不再出现 nag 消息。
  • 删除所有断点为我解决了这个问题。我在头文件上有一个被标记。很棒的提示。
  • 所有这一切都是为了隐藏问题,它仍然会出现你仍然无法通过它... -1
【解决方案2】:

我解决了:

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

【讨论】:

  • 这仍然不能防止问题再次发生(即,它仍然会在您下次编辑文件时发生)。
【解决方案3】:

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

这是因为 Item Type 仍保留为 C/C++ Source File,使其编译为单独的翻译单元而不是实际的标头,从而阻止 Visual Studio 将其识别为其他地方的标头.

我花了很长时间才弄明白。

解决这个问题:

  1. 在解决方案资源管理器中右键单击您的头文件并选择属性。

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

  3. 在 General 下,将 Item Type 更改为 C/C++ Header

  4. 按确定。

  5. 强制重新编译 #includes 标题的任何文件(或只是 Rebuild 解决方案)。

【讨论】:

    【解决方案4】:

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

    即使在干净的重建之后,我也一直在发生这种情况。这是VS 2015。我的猜测可能是调试器和编译器不同意如何散列换行符或类似的东西?修复方法是在Debug -> Options -> Debugging -> General中关闭“要求源文件与原始版本完全匹配”

    【讨论】:

    • 区别可能不仅仅是空格!
    【解决方案5】:

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

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

    【讨论】:

    • 我设法通过对解决方案运行 Clean 操作使警告消失。我不确定操作的语义,所以我想它会做一些类似于你建议的事情。感谢您的回复:)
    • @BradSullivan 好吧,如果它回来了,发表评论,我们可以尝试解决它:)它可以来自的原因并不多。
    • 如果这对你不起作用,see my answer below!
    【解决方案6】:

    原因可能是循环头依赖。 datum.h 可能包含 another_header.h(直接或间接),其中包含 datum.h。

    【讨论】:

      【解决方案7】:

      我看到这个问题的真正原因没有得到回答。所以对于仍在寻找的人来说,这里是...... 此问题最常见的原因是用于构建现有 obj 文件的源文件与现有的不同。换句话说 在对源进行新的修改后,特定项目没有构建。解决这个问题的方法是修改后重建项目。 这发生在我修改了我的静态库项目文件的情况下,然后在没有构建该项目的情况下,我启动了我的应用程序项目,该项目正在使用这个静态库项目。

      【讨论】:

        【解决方案8】:

        这对我有用:

        • 关闭VS
        • 删除*.vcxproj.filters文件
        • 重启VS

        问题应该已经解决了。

        【讨论】:

        • 不,它没有消失,仍然是同样的问题。
        【解决方案9】:

        这对我有用:

        1. 清理项目
        2. 调试/删除所有断点:)

        【讨论】:

        • 这只能修复一次。
        【解决方案10】:

        这对我有用(截至 2019 年 3 月):

        1. 点击 Visual Studio 窗口左上角的“构建”下拉菜单
        2. 选择“重建解决方案”

        【讨论】:

        • 这只能修复一次。
        【解决方案11】:

        我已经更改了文件名,现在可以使用了。

        【讨论】:

        • 这是一个红鲱鱼,不是问题。
        【解决方案12】:

        刚遇到这个。在我的情况下,我的一个.h 文件包含实现(一个具有静态方法的类),它被我的一个.cpp 文件#included,但项目设置也告诉Visual Studio 编译.h 文件.

        我手动编辑了.vcxproj.vcxproj.filters 项目文件,将.h 文件从<ClCompile> ItemGroup 移动到<ClInclude> ItemGroup。

        这对我有用;我再也没有看到“...的副本不同于...”弹出窗口。
        (请注意,这是在我尝试获取 <DependentUpon> 彻底失败之后工作。)

        【讨论】:

          【解决方案13】:

          我的解决方案:

          1. 构建 -> 配置管理器
          2. 切换到其他配置(任意,例如 Releas 或 Debug)
          3. 切换到以前的配置

          【讨论】:

            猜你喜欢
            • 2011-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-10
            • 2012-07-30
            • 2022-11-24
            • 2014-06-17
            • 2018-05-01
            相关资源
            最近更新 更多