VS2010 未正确处理预处理器条件下的"includes"



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

这对我来说是痛苦的,因为我不能信任部分构建,每当我在git中跳来跳去时,我都必须进行完全重建,这会扼杀生产力。

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

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

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

第2版:该问题似乎与#defines有关。我有一个只包含在另一个标题中的标题。。。并且它仅在#defines指定的某些条件下被包括在该报头中。所以我们有#if COND1#elif COND2#else<问题#endif中的问题标头,它已损坏。如果我把include从else中去掉,它会触发依赖项进行正确编译!

我既不知道git也不知道VS2010,但当我在基于make的系统中看到这种行为时,通常是因为版本控制系统正在提取一个文件,并给它提交的时间(甚至是提交时的修改时间)。然后,生成系统认为"源"文件仍然比"对象"文件旧,因此无法重新生成内容。

看看你是否能找到一个选项,当它进行拉取时,用git来不修正文件时间。相反,您希望新提取的文件具有当前时间。

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

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

  • 获取适用于Windows的touchtest实用程序的副本(例如,从GNUWin32站点获取
  • 编写一个预生成命令,将修改时间从utracked标头复制到跟踪的标头,但前提是它更新:

类似于:

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

PS:也许你可以用PowerShell写同样的想法,但我不知道怎么写。

最新更新