让我们把晦涩的问题变得简单......
我们有一个由许多项目组成的解决方案,其中一些项目使用 3rd 方的东西设置了自定义构建事件,用于一些黑暗魔法编译,看起来像这样:
<CustomBuild Include="..\folder\somestuff.xyz">
<FileType>Document</FileType>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">C:\Tcl\bin\tclsh.exe $(APP_PATH)\modules\APP\bin\generator.tcl -o %(RelativeDir)%(Filename) %(RelativeDir)%(Filename).xyz</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">APPGEN %(RelativeDir)%(Filename)</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(RelativeDir)%(Filename).cpp;%(RelativeDir)%(Filename).h;%(RelativeDir)%(Outputs)</Outputs>
</CustomBuild>
在我们将 VS2015 切换到 VS2019 之前,这一直正常工作,因为现在在编译期间它报告说:
Project is not up-to-date: build output 'd:\projects\program\app\src\plugins\shared\' is missing
. 这或多或少没问题,但它迫使编译器也重新编译该项目的依赖项,这开始真的很烦人,因为即使没有进行任何更改,每次都需要重建几个项目。
我发现问题出在这行自定义构建:
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(RelativeDir)%(Filename).cpp;%(RelativeDir)%(Filename).h;%(RelativeDir)%(Outputs)</Outputs>
从这部分更准确地说:%(RelativeDir)%(Outputs)作为在同一标记中检查.cpp和.h文件不会产生任何问题。所以我删除了这个目录检查。删除这段代码后,项目会正确编译,并且不会整天重新编译。
那么为什么自定义构建的输出检查现在可以正常工作,只是文件和目录会产生这种问题呢?
是的,检查的目录存在,它指的是现有的正确路径。