Visual Studio需要为每次更改重新构建解决方案

4
我目前正在使用c++开发游戏引擎。随着项目的进展,我发现生成的可执行文件经常不能反映最新的代码更改。但是完全清除解决方案并重新构建它可以解决问题。不幸的是,对于较大的代码库来说,完全重建已不再是可行的选择。
我已经在stackoverflow上检查了不同的解决方案:
- 我已经检查过我的“生成和运行”设置,确保其设置为“始终构建”。 - 配置管理器也被设置为“构建”。
附加信息:
- 这是一个c++中带有OpenGL、GLFW和glad的项目。 - 我使用的是Visual Studio Community 2017版本15.2。
这是一个非常烦人的问题,导致生产力大量损失,因为每次想要看到更改时都必须完全重建整个解决方案。如果需要更多信息,请询问。
更新:
以下是该问题的详细说明:
1.我有一个类可以旋转对象TransformerScript.cpp 2.我已将旋转速度设置为1。
3.对象如预期一样旋转。
4.现在我将速度浮点值从1更改为0。
5.我按运行(本地Windows调试器)
6.这是输出日志:

1>------ 开始构建: 项目: Star-Engine, 配置: Debug x64 ------

1>TransformerScript.cpp

1>c:\users\haeri\documents\github\space-engine\star-engine\src\header\matrix4f.h(44): 警告 C4267: 'argument': 从 'size_t' 到 'unsigned int' 的转换可能导致数据丢失

1>c:\users\haeri\documents\github\space-engine\star-engine\src\header\matrix4f.h(44): 警告 C4244: 'initializing': 从 'float' 到 'int' 的转换可能导致数据丢失

1>c:\users\haeri\documents\github\space-engine\star-engine\src\header\matrix4f.h(45): 警告 C4267: 'argument': 从 'size_t' 到 'unsigned int' 的转换可能导致数据丢失

1>c:\users\haeri\documents\github\space-engine\star-engine\src\source\transformerscript.cpp(13): 警告 C4244: 'argument': 从 'double' 到 'float' 的转换可能导致数据丢失

1>编译中...

1>生成代码...

1>跳过...(未检测到相关更改)

1>TestScene.cpp

1>Star-Engine.vcxproj -> C:\Users\haeri\Documents\github\Space-Engine\x64\Debug\Star-Engine.exe

c:\users\haeri\documents\github\space-engine\star-engine\src\source\glad.c(51): 警告 C6308: 'realloc' 可能返回空指针:将 null 指针分配给 'exts_i',作为传递给 'realloc' 的参数,将导致原始内存块泄漏。

c:\users\haeri\documents\github\space-engine\star-engine\include\stb\stb_image.h(3667): 警告 C6001: 使用未初始化的内存 'coutput'。

1>Star-Engine.vcxproj -> C:\Users\haeri\Documents\github\Space-Engine\x64\Debug\Star-Engine.pdb (部分 PDB)

1>已完成构建项目“Star-Engine.vcxproj”。

========== 构建: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

  1. 编译后的可执行文件启动
  2. 结果是相同的图形以相同的速度旋转。
  3. 期望行为:没有旋转,因为浮点数被设置为0。
  4. 我被迫进行“清理解决方案”和“重新生成解决方案”
  5. 这需要我的笔记本电脑约1到2分钟的时间
  6. VS完成重建新解决方案
  7. 我按下运行(本地Windows调试器)
  8. 对象不动了。(这是预期的)

替代方案

  1. 在速度浮点值的位置设置断点
  2. 我按下运行(本地Windows调试器)
  3. 有时候(90%的情况下)会弹出错误提示。其他时候(10%的情况下),一切都如预期的那样。

enter image description here

  1. 我按下“确定”
  2. 已编译的可执行文件开始运行
  3. 结果是相同的图形以相同的速度旋转。
  4. 期望的行为:没有旋转,因为浮点数被设置为0。
  5. 断点没有被触发!

1
您是否有多个项目或只有一个?如果是前者:听起来这些项目相互依赖,但您尚未告知这些依赖关系的解决方案,因此它会按照任意顺序构建它们,而不是按照正确的(对于您而言)顺序构建。 - stijn
所以你有一个项目,你更改属于该项目的代码(而不是外部库中的代码),你只需“构建”,然后可执行文件就会被构建出来(也就是说,在输出日志中可以看到已更改的源文件再次被编译,链接器创建了一个新的可执行文件并将其复制到您运行它的位置),但该可执行文件不包含最新的更改?可能是增量链接中的错误(您使用了吗?关闭它进行检查),但没有实际的项目/代码来重现它很难确定:这绝对不是VS的开箱即用行为。 - stijn
@stijn 你说的有些东西超出了我的理解范围,但是没错。我在我的代码中做了一些小改动(例如:改变一个对象的位置)。然后我点击运行(本地Windows调试器),但是这个对象仍然停留在旧的位置,好像VS没有注意到我改变了代码一样。我不确定增量链接是什么。如果默认情况下关闭它,那么我就没有改变它。此外,如果需要的话,我可以提供GitHub存储库的链接。 - Haeri
你需要检查构建输出窗口,其中显示构建日志,以确定项目是否有效地构建并创建了一个新的可执行文件。它应该有类似于“Link: my.vcxproj -> path\to\my.exe”的文本,你需要验证这也是你正在运行的可执行文件。并在代码上设置断点,以便在调试期间查看执行了什么、使用了哪些值来获取你的新位置等信息。 - stijn
@stijn 我已经更新了原帖并添加了构建日志。是的,我可以确认程序通过了新代码的运行。 - Haeri
显示剩余8条评论
1个回答

3

我曾经在一个C#项目中也遇到过同样的问题,解决方法如下:

  1. 进入“解决方案”→“属性”
  2. 勾选“配置属性”→“配置”
  3. 对于我遇到的情况,解决方案中的一个项目未勾选“生成”标志。

在我的情况下,构建标志已设置为所有配置和平台的组合。 - Haeri
1
这个解决方案对我有效,但我首先尝试删除所有bin和obj子文件夹,可以看看这个链接https://dev59.com/yG025IYBdhLWcg3wUESP#6078114 - Windgate

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