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

VS2010不处理”的问题;包括「;在预处理器条件下正确地 我有一个相当大的VS2010 C++解决方案。解决方案中只有一个项目,因此项目之间没有相互依赖关系。问题是,当我从GIT获取更新时,VS2010有时不够聪明,无法重建受更新的新文件影响的翻译单元。这导致可执行文件不可避免地以某种虚假的方式崩溃,c++,visual-studio-2010,compiler-construction,C++,Visual Studio 2010,Compiler Construction,这对我来说是痛苦的,因为我不能信任部分构建,并且每当我在git中跳转时就不得不进行完整的重建,这会降低生产率 注意:我并没有以任何方式责怪git,我只是指出我的过程,以防它是相关的。 还要注意:当我构建时,我右键单击项目并选择“构建” 有人知道“调试”这个编译器的方法吗?知道为什么它没有注意到它需要重建依赖于更改的其他文件吗 编辑:经过进一步调查,我可以排除我使用GIT的问题。我可以通过编辑一个包含在许多地方的头文件来复制它,保存它,然后运行一个“构建”,它不想构建任何新文件 编辑2:该问题似乎

这对我来说是痛苦的,因为我不能信任部分构建,并且每当我在git中跳转时就不得不进行完整的重建,这会降低生产率

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

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

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


编辑2:该问题似乎与#定义有关。我有一个只包含在另一个标题中的标题…在#defines指定的某些条件下,它只包含在该标题中。因此,我们有#if COND1#elif COND2#else<问题标题#endif,这是不正确的。如果我将include从else中去掉,它将触发依赖项以正确编译

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

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


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

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

  • 获取适用于Windows的
    触摸
    测试
    实用程序的副本(例如,从
  • 编写一个预构建命令,将修改时间从utracked头复制到跟踪头,但仅当修改时间较新时:
比如:

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

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

VS通过比较文件日期和.obj文件上的日期来确定要构建的内容。git是否可能在获取文件时将其追溯到日期?标记,这似乎是合乎逻辑的,但git文档声称它不会恢复旧的时间戳以避免此问题。Ma在这里,CRO显然是一个麻烦制造者,尤其是当它们的值在编译时发生更改时。如果标头包含一个类声明,该声明替换了另一个标头中的类,则需要关闭/Gm最小重建选项。我没有启用最小重建。此外,宏的值不会更改,它们只在一个位置设置在主标题中。很吸引人…听起来可能是真的。我会朝这个方向挖掘一些。嗯,不幸的是,根据文档,情况似乎不是这样:谢谢,但我正在寻找编译器级别的解决方案。我要么遇到了编译器错误,要么我的代码在某个级别上做了一些粗略的工作,这使得编译器做了一些同样可疑的事情。我担心任何间接的工作都会以其他形式出现在其他地方。