设置场景:我从一位离职的团队成员那里继承了一个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++使用其对输出文件名的了解来了解,由于输出比输入新,因此不需要重新构建,从而稍微加快了构建速度。