为什么Visual Studio 2008总是重新构建整个项目?

12

我有一个包含大约60个C++源文件的Visual Studio工程。 我可以进行构建,并且没有出现错误。 但如果我立即再次按F7,它总是重新编译约50个源文件。 这很奇怪,因为它没有重新编译所有文件。

我已经设置了“启用最小重建”(/Gm)。 有什么想法是为什么会这样做吗? 没有任何文件的修改日期在未来。


抱歉,这主要是C++,还有一些C。 - Rocketmagnet
2
如果你执行“解决方案/清理”和/或“重新生成全部”,问题是否会消失?如果你关闭“启用最小重建”选项,问题是否会消失? - ChrisW
我尝试了清理和重建所有内容,但问题仍然存在。没有尝试禁用最小重建。然而,今天早上它似乎表现良好! - Rocketmagnet
就我所知,过去使用“增量链接”等功能时存在问题;因此,我关闭了这些功能并专注于其他减少构建时间的方法。 - ChrisW
“其他方法”包括https://dev59.com/Y3NA5IYBdhLWcg3wUL9Y#1014671以及Lakos的书中所述。 - ChrisW
我的重建是由于项目中的头文件实际上不存在,因为移动了文件位置。忽略了那些大问号。 - Lothar
18个回答

8

你的文件日期是否在未来?这可能是因为你更改了时区或系统时钟时间。未来的日期会使IDE混乱,并强制每次按下F7或F5键时重新构建。


1
没有任何源文件是在未来的。我检查了所有的文件。 - Rocketmagnet
3
当这种事情发生在我身上时,这种情况总是存在的。请仔细检查您的文件日期,包括来自外部来源的标题! - user541686
我经常遇到这种情况,但从未出现过这种情况。 - user645280

7

我解决了同样的问题。

在我的情况下,编译器显示警告,如果指定了/Gm,则需要/Zi选项。

/Gm启用“最小重建”,需要.pdb文件中的调试信息。因此,如果您不想使用.pdb,请禁用最小重建-这在我的情况下解决了问题。


5
很可能是依赖关系的问题。
考虑以下几种可能性:
- 如果您为解决方案中的某些文件定义了自定义构建工具,请确保输出属性包含正确的文件名。如果构建工具的输出与输出文件名指定的不一致,建造者将重建该文件。 - 如果您有自定义构建事件,请检查这些构建事件的输出是否不会影响要构建的文件的依赖关系。 - 当我尝试在后期构建时将一些输出文件复制或移动到构建文件夹时,我遇到了问题。影响构建过程输出文件时间戳的后期构建操作将每次确定重建。

我没有自定义的构建事件。一切都是普通的编译和链接,使用库文件。 - Rocketmagnet

4

项目属性 -> "C/C++" -> "输出文件" -> "程序数据库文件名"选项不应该为空。通过从下拉框中选择来设置此选项。选项将被设置为:$(IntDir)\vc90.pdb。同时,vcproj文件中的ProgramDataBaseFileName=""行将被删除。

这样,在构建项目或解决方案时,只有更改过的*.cpp文件才会被重新编译。


4
在我的情况下(使用VS2005的C++),这种效果只出现在Release配置中。而且,编译器选项/Gm会被忽略,如果没有设置/Zi选项,工作室将在构建输出中告诉你。通过以下方式设置/Zi:
Configuration Properties -> C/C++ -> General -> Debug Information Format : Program Database (/Zi)
这样就可以了。但是,当发布配置需要一些关于调试的东西时,这里是否有什么问题呢?对我来说还不太清楚!

最终发现我的问题是我不小心在发布项目中关闭了调试信息(/Zi)- 显然在构建过程中它被用来决定需要构建什么! - Wayne Uroda
看起来你需要在ProgramDatabase名称处留空字符串,或者你需要生成数据库。将构建输出设置为诊断级别,您可以看到以下信息:任务“Delete”被跳过,因为条件为假; ...('ProgramDatabase'!= ''和'ProgramDatabase'!= 'OldStyle'且'ARM \ Release \ vc110.pdb'!=''和!Exists(ARM \ Release \ vc110.pdb))。 - Wayne Uroda

3

经过几天的搜索,我最终找到了解决方案。

当我将项目移动到新电脑时,遇到了这个问题。我已经多次检查了文件的创建日期,这些日期是最新的,但修改日期却很旧(有点奇怪),即使我更改了文件。

简单更新文件即可解决问题。


3

我遇到了同样的问题,看起来是因为我关闭了浏览信息。属性->C/C++->浏览信息->启用浏览信息->无。唯一的解决方法是重新开启它。顺便说一下,这是针对Xbox 360项目的,我的其他项目没有这个问题。


3
似乎这个问题可能由很多原因引起,但是对我有用的解决方法是:
  1. 关闭Visual Studio
  2. 手动删除所有的bin和obj文件夹(清理似乎不起作用)
  3. 打开解决方案并运行Clean(我不确定这是否必要,但为了保险起见我这样做了...)
  4. 像平常一样构建
注意:这是针对Visual Studio 2010中C#程序的。

2

一个原因是如果源文件之一的“上次修改日期”设置为未来的某个日期:它会重新构建,然后源文件仍然晚于可执行文件。

日期问题可能会发生在源文件位于远程机器(网络共享)的目录中,甚至可能会发生在您机器的时间与运行源版本控制系统的机器的日期不同步时。


没有任何源文件在未来。所有文件都在我的本地机器上。 - Rocketmagnet

1

检查您的项目是否包含任何在磁盘上不存在的.h头文件。当我删除一个我实际上没有在任何地方包含的头文件,但是忘记从我的VS解决方案导航器中删除它时,这种情况总是发生在我身上。注意:缺少的头文件在构建过程中不会产生任何错误(当未在任何地方#include时)。


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