0

我有一个相当大的 VS2010 C++ 解决方案。解决方案中只有一个项目,因此项目之间没有相互依赖关系。问题是,当我从 GIT 中提取更新时,VS2010 有时不够聪明,无法重建受更新的新文件影响的翻译单元。这会导致可执行文件不可避免地以某种虚假方式崩溃。

这对我来说很痛苦,因为我不能相信部分构建,并且每当我在 git 中跳来跳去时都不得不进行完全重建,这会降低生产力。

注意:我没有以任何方式责怪 git,我只是指出我的过程以防万一。另请注意:当我构建时,我右键单击项目并选择“构建”。

有谁知道“调试”这个编译器的方法,知道为什么它没有注意到它需要重建依赖于更改的其他文件?

编辑:经过进一步调查,我可以排除我使用 GIT 的问题。我可以通过编辑包含在许多地方的头文件来重现这一点,保存它然后运行不想构建任何新文件的“构建”。

编辑2:问题似乎与#defines 有关。我有一个仅包含在另一个标头中的标头...并且仅在#defines 指定的某些条件下才包含在该标头中。所以我们有#if COND1 #elif COND2 #else < 有问题的问题标题#endif 并且已经损坏。如果我将包含从其他情况中取出,它会触发依赖项以正确编译!

4

2 回答 2

1

我既不知道 git 也不知道 VS2010,但是当我看到基于 make 的系统的这种行为时,通常是因为版本控制系统正在拉取文件并给它提交的时间(甚至是它的修改时间)当它被提交时)。然后构建系统认为“源”文件仍然比“目标”文件旧,并且无法重建内容。

看看你是否可以找到一个选项让 git 在它执行拉取时不修复文件时间。相反,您希望新提取的文件具有当前时间。

我怀疑这将为您解决问题。

于 2012-09-13T18:48:18.347 回答
0

如果问题是,正如您在 EDIT2 中所说,VS 的依赖检查器未检测到头文件,您可以使用以下技巧解决它:

  • touch获取 Windows 的和实用程序的副本test(例如从GNUWin32 站点.
  • 编写一个预构建命令,将修改时间从 utracked 标头复制到跟踪的标头,但前提是它较新:

就像是:

test.exe untracked.h -nt tracked.h && touch.exe -r untracked.h tracked.h

PS:也许你可以使用 PowerShell 编写相同的想法,但我不知道如何。

于 2012-09-13T21:43:21.597 回答