我有这样的项目依赖关系:
Main -> A, Common
A -> B, Common
与构建顺序:
Common
B
A
Main
该解决方案在Visual Studio 2019中构建良好。但是在MSBuild中,它构建Common.lib
,B.lib
,A.lib
…然后删除Common.lib
,然后尝试(和失败)构建Main.exe
。
我试过改变Common.lib
的输出目录,但每次MSBuild都会在新的位置构建它,然后在A.lib
构建后删除它。它不会删除A.lib
或B.lib
,即使它们与Common.lib
在相同的目录中。我也有另一个解决方案与不同的主项目具有相同的依赖关系(A
,B
和Common
),但MSBuild在这方面工作得很好。
有什么想法从哪里开始解决这个问题吗?
所有的项目都是在c++与MFC在一个静态库,使用多字节字符集(解决方案是从VC2005升级)。我从命令行(cmd.exe)运行MSBuild。版本号:
Visual Studio 16.8.5
MSBuild 16.8.3.61104
更新:使用-verbosity:diag
作为@dxiv建议的构建日志现在在最后给出了这个构建层次结构。(我已经重新命名了项目以匹配上面的名称)
============================== Build Hierarchy (IDs represent configurations) =====================================================
Id : Exclusive Time Total Time Path (Targets)
-----------------------------------------------------------------------------------------------------------------------------------
0 : 0.429s 105.369s D:releasestemp_srcMain.sln (rebuild)
. 1 : 0.270s 104.941s D:releasestemp_srcMain.vcxproj.metaproj (Rebuild)
| | 2 : 6.218s 31.257s D:releasestemp_srcAA.vcxproj (Rebuild)
| | | 3 : 1.600s 1.600s D:releasestemp_srcBB.vcxproj (Clean)
| | | 4 : 0.764s 0.764s D:releasestemp_srcCommonCommon.vcxproj (Clean)
| | | 5 : 2.184s 2.184s D:releasestemp_srcBB.vcxproj ()
| | | 6 : 2.507s 2.507s D:releasestemp_srcCommonCommon.vcxproj ()
| | | 7 : 0.536s 0.536s D:releasestemp_srcBB.vcxproj (GetNativeManifest)
| | | 8 : 0.643s 0.643s D:releasestemp_srcCommonCommon.vcxproj (GetNativeManifest)
| | | 9 : 0.585s 0.585s D:releasestemp_srcBB.vcxproj (GetProjectInfoForReference)
| | | 10 : 0.668s 0.668s D:releasestemp_srcCommonCommon.vcxproj (GetProjectInfoForReference)
| | . 11 : 0.549s 0.549s D:releasestemp_srcCommonCommon.vcxproj (GetCopyToOutputDirectoryItems)
| . 12 : 5.923s 10.062s D:releasestemp_srcMain.vcxproj (Rebuild)
| | | 13 : 0.696s 0.696s D:releasestemp_srcCommonCommon.vcxproj (Clean)
| | | 14 : 1.845s 1.845s D:releasestemp_srcAA.vcxproj (GetNativeManifest)
| | | 15 : 0.969s 0.969s D:releasestemp_srcAA.vcxproj (GetProjectInfoForReference)
| | . 16 : 0.629s 0.629s D:releasestemp_srcCommonCommon.vcxproj (GetProjectInfoForReference)
ID 13显示Common.vcxproj
在Main
开始重建时被清理;这似乎是删除Common.lib
的操作。什么可能导致它执行这种清理?
您应该注意到构建有一个顺序:Common—>B—> a—>Main
主要如果项目有一个错误,它不会停止A和B因为它们没有错误。
还,如果底部项目Common有一个错误,当它会中断整个重建过程,删除A
和Main
项目输出文件。
还,当您尝试更改四个项目的外部目录时,您应该右键单击每个项目Properties——在一般——在输出目录或者只是修改vcxproj
文件的每个outdir属性。当您重新构建它时,它将删除旧的位置输出文件,然后重新构建。
在我这边,当我运行msbuild xxxxxx.sln -t:clean
时,它删除了所有旧的以前的输出文件。
如果不是,我认为你现在的项目有问题。请尝试以下步骤:
1)删除这些项目的任何项目引用,然后右键单击Reference—>Re-add project Reference
2)重新修改每个vcxproj文件下的outdir
属性,然后使其值相同。
3)删除.vs
隐藏文件夹和这四个项目的所有输出文件夹。
4)相反,运行msbuild xxxxxx.sln -t:rebuild
来构建您的解决方案。