1

我有一个 C++ 项目,我需要在一些头文件上运行自定义构建工具来生成编译该项目时所需的代码。一般来说,我的配置有效。我触发了构建,VS/MSBuild 检测输出文件是否是最新的,并且仅在必要时运行自定义构建工具。

但是,如果构建与同一项目的另一个配置结合运行,则会出现问题。两种配置都依赖于自定义构建工具的输出文件。因此,如果按顺序运行,则只有一个配置应该触发自定义构建工具运行。对于哪个配置触发构建,自定义构建工具的输出文件已经存在并且是最新的。所以没有必要再次构建它们。不幸的是,这正是正在发生的事情。由于自定义构建工具需要相当长的时间来运行,这会显着增加构建时间。另一个有趣的方面是,一旦两个配置都运行,我可以再次触发它们中的任何一个,并且不会调用自定义构建工具。

我对文档的期望是触发了自定义构建工具:

  • 如果缺少任何指定为输出的文件
  • 如果我为其指定自定义构建工具的文件的修改晚于任何指定为输出的现有文件
  • 如果我指定为Additional Dependencies的任何文件的修改晚于指定为Outputs的任何现有文件

但所有这些都独立于触发构建的配置。

有谁知道为什么会发生这种情况?我检查了自定义构建工具的设置对于两种配置是否相同。两种配置的输出文件都生成到同一个文件夹中。

4

1 回答 1

1

您所指的文档基本上是正确的,但它没有说其中的所有内容基本上都是每个项目配置/平台,因为它使用 tracker.exe,它依赖于默认进入中间目录的 .tlog 文件。因此,正如您所了解的,使所有配置对 tlog 文件使用相同的位置应该让跟踪器满意,并且只在需要时调用自定义构建工具,独立于配置/平台。我不确定我是否会推荐其中的任何一个,共享临时对象文件可能会在以后给您带来问题。

解决这个问题的另一种方法是添加一个只有一个配置的单独项目,比如“自定义”,然后在那里进行自定义构建。比使您当前的项目依赖于该项目并在解决方案的配置管理器中调整所有条目,以便您现在拥有的每个配置都为新项目构建“自定义”配置。

于 2016-02-26T13:47:15.667 回答