Visual Studio 2022 社区:无法使自定义步骤的编辑生效,无法在 proj 文件中找到?



设置场景:我从一位离职的团队成员那里继承了一个VC++解决方案。它有一个带有.i文件的项目,我相信它恰好是一个名为swig的实用程序的输入文件。右键单击.i文件-->属性-->配置属性-->自定义生成工具-->General显示了对swig.exe的调用,参数为"%"(FullPath(";(我假定该.I文件的名称为完整路径(。编译后,swig.exe似乎被正确调用了。

完成构建之后-->构建解决方案,它输出:

6>C:Program FilesMicrosoft Visual Studio2022CommunityMSBuildMicrosoftVCv170Microsoft.CppCommon.targets(245,5): warning MSB8065: Custom build for item "....swigMyFile.i" succeeded, but specified output "t:MyEmployerMyCodeBaseMyProjectauxiliaryvisualstudioprojectsvs2017_wrap.cxx" has not been created. This may cause incremental build to work incorrectly.

回到上面的"属性"对话框,Outputs定义为$(InputName)_wrap.cxx;%(Outputs)。谷歌搜索一下,我发现$(InputName)自VS2015左右以来不再受支持。

问题:好吧,让我们假设这是早期工程师应该在某个时候解决的问题。也许它允许VS验证该命令是否真的生成了输出文件。但它总是有效的,而且生产失败很快就会变得很明显,所以我们不需要检查**因此,我删除$(InputName)_wrap.cxx;并点击"确定",然后执行"清理解决方案"one_answers"构建解决方案">

但编辑似乎尚未生效

我回去查看,是的,它不见了。但我仍然得到上面关于_wrap.cxx的错误…

所以我退出并重新启动。。。$(InputName)_wrap.cxx;又回来了

因此,在Linux(装载相同的文件系统(上,我会查找包括二进制文件在内的所有文件,但在任何地方都找不到_wrap.cxx。我在任何地方都找不到swig.exe我在任何地方都找不到$(InputName)

所以问题是:这些东西在哪里可以定义,为什么我不能删除它?!?**

好吧,我非常仔细地浏览了*.vcxproj文件,寻找任何似乎与我所知道的VC++的某些功能无关的东西。

我发现了以下神秘的线路:

<Import Project="$(VCTargetsPath)Microsoft.Cpp.Default.props" />
<ImportGroup Label="PropertySheets">
<Import Project="$(MYCOMPANY_DIR)$(MSVC_VERSION)foo.props" Condition="exists('$(MYCOMPANY_DIR)$(MSVC_VERSION)foo.props')" />
</ImportGroup>

$MYCOMPANY_DIR比我的个人项目高出两个目录级别,所以我的find/grep找不到有问题的命令。

在文件$(MYCOMPANY_DIR)$(MSVC_VERSION)foo.props中,我看到:

<ItemGroup>
<CustomBuild Include="....swig$(ProjectName).i">
<FileType>Document</FileType>
<Outputs>$(InputName)_wrap.cxx;%(Outputs)</Outputs>
<Command>%MYCOMPANY_DIR%third_partyswigwin-3.0.6swig.exe -c++ -python  -I%MYCOMPANY_DIR%/myproduct/include -I%MYCOMPANY_DIR%/myproduct/swig -I%MYCOMPANY_DIR%/libraries -I../../../third_party/include   -outdir $(OutDir) "%(FullPath)"</Command>
</CustomBuild>
</ItemGroup>

所以基本上,Visual C++显示了这个$(InputName);道具";文件(不管是什么(,就好像它是我自己项目的属性,,甚至让我编辑它,并明显跟踪编辑,尽管实际上没有使用它。改变这个";道具";从不再支持的$(InputName)$(OutDir)swig%(FileName)_wrap.cxx的文件现在让我在没有任何警告的情况下继续制作。

此外,我假设VC++使用其对输出文件名的了解来了解,由于输出比输入新,因此不需要重新构建,从而稍微加快了构建速度。

最新更新