我有一个 C++ 项目,我需要在一些头文件上运行自定义构建工具以生成编译该项目时所需的代码。一般来说,我的配置有效。我触发构建,VS/MSBuild 检测输出文件是否是最新的,并仅在必要时运行自定义构建工具。
但是,如果构建与同一项目的另一个配置结合运行,则会出现问题。这两种配置都取决于自定义构建工具的输出文件。因此,如果按顺序运行,只有一个配置应该触发自定义构建工具运行。对于第二次触发构建的配置,自定义构建工具的输出文件已经存在并且是最新的。因此无需再次构建它们。不幸的是,这正是正在发生的事情。由于自定义构建工具需要相当长的时间才能运行,因此这会显着增加构建时间。 另一个有趣的方面是,一旦两个配置都运行了,我可以再次触发它们中的任何一个,并且不会调用自定义构建工具。
我对 documentation 的期望是自定义构建工具被触发:
- 如果指定为输出的任何文件丢失
- 如果我为其指定自定义构建工具的文件的修改时间晚于指定为输出 的任何现有文件
- 如果我指定为Additional Dependencies 的任何文件的修改时间晚于指定为Outputs 的任何现有文件
但所有这些都独立于触发构建的配置。
有人知道为什么会发生这种情况吗?我检查了两种配置的自定义构建工具的设置是否相同。两种配置的输出文件都生成到同一文件夹中。
最佳答案
您所指的文档基本上是正确的,但它没有说明其中的所有内容基本上都是针对每个项目配置/平台的,因为它使用的 tracker.exe 取决于 .tlog 文件,这些文件默认进入中间目录。因此,正如您所了解的那样,让所有配置都使用相同的 tlog 文件位置应该让跟踪器满意并且只在需要时调用自定义构建工具,与配置/平台无关。不过,我不确定我会推荐其中的任何一个,共享临时对象文件可能会在以后给您带来麻烦。
处理这个问题的另一种方法是添加一个单独的项目,只有一个配置,比如“自定义”,然后在那里进行自定义构建。比让您当前的项目依赖于该项目,并在解决方案的配置管理器中调整所有条目,以便您现在拥有的每个配置都为新项目构建“自定义”配置。
关于c++ - MSBuild 在针对不同配置运行时不必要地运行自定义生成工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35624702/