VS2010未正确处理预处理器条件中的“包含”

时间:2012-09-13 17:30:57

标签: c++ visual-studio-2010 compiler-construction

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

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

注意:我不是以任何方式责怪git,我只是指出我的过程,以防它相关。 还注意:当我构建时,我正确地点击项目并选择“Build”。

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

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

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

2 个答案:

答案 0 :(得分:1)

我既不知道git也不知道VS2010,但是当我看到基于make系统的这种行为时,通常是因为版本控制系统正在拉动文件并给它提交的时间(甚至修改)它承诺时的时间)。然后构建系统认为'source'文件仍然比'object'文件旧,并且无法重建东西。

看看你是否可以找到一个git的选项,以便在拉动时不修复文件的时间。相反,您希望新拉出的文件具有当前时间。

我怀疑这会为你解决问题。

答案 1 :(得分:0)

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

  • 获取Windows touchtest实用程序的副本(例如,来自GNUWin32 site
  • 编写一个预建命令,将修改时间从utracked标题复制到被跟踪标题,但前提是它更新:

类似的东西:

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

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