【问题标题】:Visual Studio 2017 doesn't compile small changes to code when building for releaseVisual Studio 2017 在构建发布时不会编译对代码的微小更改
【发布时间】:2018-05-13 20:09:39
【问题描述】:

当我对源代码进行小的更改时,有时会发生这种情况,例如删除一行代码或更改某些值。

案例A

  1. player.y = 100; 更改为player.y = 250;
  2. CTRL+F5编译代码
  3. 玩家仍然出现在y: 100
  4. player.symbol = "O"; 更改为player.symbol = "P";
  5. CTRL+F5编译代码
  6. 玩家现在出现在正确的位置y: 250

到目前为止我已经尝试过

  • 干净的解决方案 - 这行得通,但我宁愿在进行更改时不必依赖它
  • BuildBuild > Configuration Manager... 下的项目检查
  • CTRL-SHIFT-B 仍然编译错误代码。
  • 以管理员身份运行 VS - 仍然编译错误代码。
  • 我查看了可执行文件的创建日期。编译时它不会更新。
  • 在编译之前删除可执行文件会重新创建相同的可执行文件而不进行更改。
  • 我在同一台计算机上安装了另一个 Visual Studio 时遇到了同样的问题

项目位于本地硬盘上。

编辑: 我找到了这个link。问题似乎非常相似,尽管在现在进行测试时,它不仅仅是编辑浮点数。我使用的是 Visual Studio Community Version 15.7.1,但在修补之前也遇到了这个问题。

在构建调试时(到目前为止)似乎没有发生这种情况。

【问题讨论】:

  • 编译器报告的错误是什么?另外:您是通过 IDE 编辑代码,还是使用外部文本编辑器?
  • 我在 Visual Studio IDE 中编程。没有错误消息,它编译并运行可执行文件(没有更改)。
  • @Angew 我怎么确定?如果我删除可执行文件,它会使用相同的未更改代码重新创建它。
  • 你确定ctrl+f5是你的key map下的编译命令吗?我的选择 ctrl+f5 在不调试的情况下运行,要编译的是“f7”,只编译当前文件(仅在聚焦源文件而不是头文件时才有效)它是“ctrl+f7”,重建解决方案是“ ctrl+alt+f7”。查看构建菜单并确保您的快捷键。

标签: visual-studio visual-c++ compilation


【解决方案1】:

这可能看起来很痛苦,但在进行任何重大更改后,清理解决方案并重新构建项目通常是个好主意。您可能认为重新编译单个翻译单元会起作用,并且在某些情况下可能是正确的,但如果其他目标文件依赖于您刚刚更新的翻译单元,则它们也需要重新编译,否则 Visual Studio 将使用旧的目标文件之前已经建成。

至于 CTRL+F5 无论你是在debug 还是release 模式都只是告诉 Visual Studio 你想在没有调试的情况下运行,因为它没有进行项目或解决方案的编译和构建。您确定您没有将 CTRL+F5CTRL+F7 混淆,因为用户 SoronelHateir 在评论?在对源代码进行任何更改后,最好先重新编译该单个文件以确保没有编译错误。然后最好在解决方案中重建当前项目。

另一方面,如果您的解决方案有多个项目,例如:一个项目是静态链接的库,另一个项目是您的主要可执行项目,并且您所做的更改在您的库中,具体取决于主项目的方式取决于库项目,您可能至少需要重新构建库项目,在某些情况下,您甚至可能需要重新构建主启动项目。大多数时候只重建静态链接库就足够了;很少需要重新构建链接库的主程序才能看到新的更改,但在极少数情况下两者都必须重新构建。

我再说一遍;是的,必须做一个干净的解决方案并完全重建似乎很痛苦,但过了一段时间,这是确保所有目标文件都是最新的最安全的路径。您在自己的解决方案中看到的是使用更新代码运行程序的副作用,但输出与旧目标文件的输出匹配。这是由于 IDE 使用了由于您没有重新构建解决方案而已经存在的较旧或陈旧的目标文件。清理解决方案会清除所有旧目标文件以及用于将源代码编译成翻译单元以生成适当目标文件的任何中间文件。

其他人在上面提到的 IDE 中有一些设置,例如用户:Bo Persson 从他们的回答中指出,您可以更改 Visual Studio 将如何重新编译、重建项目或解决方案的行为。

【讨论】:

    【解决方案2】:

    在visual studio中,修改后,我总是点击(在菜单栏中):

    构建 -- 重建解决方案

    请注意,这不同于“CTRL+F5”和“CTRL-SHIFT-B" 它总是会拾取所有更改并重新编译您的程序

    【讨论】:

    • 对于大型项目,这是一个糟糕的建议,因为它会重建一切。它基本上相当于make clean; make all。如果完整解决方案的构建时间以小时计算,并且您更改了一个小的.dll,那么重建全部不是您想要的。
    【解决方案3】:

    我尝试了当前解决方案中提到的所有方法,但对我不起作用。然而,在经历了很多挫折之后,我意识到我正在运行我的调试器。尝试转到 Debug 标签,然后按 Stop Debugging。最后确保从这个下拉框中选择Release(我的是Debug)。

    【讨论】:

      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 2020-07-21
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      相关资源
      最近更新 更多