【发布时间】:2021-03-03 02:53:05
【问题描述】:
我有这样的项目依赖项:
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
更新:
@dxiv 建议的使用-verbosity:diag 的构建日志现在在末尾给出了这个构建层次结构。 (我已重命名项目以匹配上面的名称)
============================== Build Hierarchy (IDs represent configurations) =====================================================
Id : Exclusive Time Total Time Path (Targets)
-----------------------------------------------------------------------------------------------------------------------------------
0 : 0.429s 105.369s D:\releases\temp_src\Main.sln (rebuild)
. 1 : 0.270s 104.941s D:\releases\temp_src\Main.vcxproj.metaproj (Rebuild)
| | 2 : 6.218s 31.257s D:\releases\temp_src\A\A.vcxproj (Rebuild)
| | | 3 : 1.600s 1.600s D:\releases\temp_src\B\B.vcxproj (Clean)
| | | 4 : 0.764s 0.764s D:\releases\temp_src\Common\Common.vcxproj (Clean)
| | | 5 : 2.184s 2.184s D:\releases\temp_src\B\B.vcxproj ()
| | | 6 : 2.507s 2.507s D:\releases\temp_src\Common\Common.vcxproj ()
| | | 7 : 0.536s 0.536s D:\releases\temp_src\B\B.vcxproj (GetNativeManifest)
| | | 8 : 0.643s 0.643s D:\releases\temp_src\Common\Common.vcxproj (GetNativeManifest)
| | | 9 : 0.585s 0.585s D:\releases\temp_src\B\B.vcxproj (GetProjectInfoForReference)
| | | 10 : 0.668s 0.668s D:\releases\temp_src\Common\Common.vcxproj (GetProjectInfoForReference)
| | . 11 : 0.549s 0.549s D:\releases\temp_src\Common\Common.vcxproj (GetCopyToOutputDirectoryItems)
| . 12 : 5.923s 10.062s D:\releases\temp_src\Main.vcxproj (Rebuild)
| | | 13 : 0.696s 0.696s D:\releases\temp_src\Common\Common.vcxproj (Clean)
| | | 14 : 1.845s 1.845s D:\releases\temp_src\A\A.vcxproj (GetNativeManifest)
| | | 15 : 0.969s 0.969s D:\releases\temp_src\A\A.vcxproj (GetProjectInfoForReference)
| | . 16 : 0.629s 0.629s D:\releases\temp_src\Common\Common.vcxproj (GetProjectInfoForReference)
ID 13 显示Common.vcxproj 正在清理,就像Main 开始重建一样;这似乎是删除Common.lib 的操作。什么可能导致它执行这种清理?
【问题讨论】:
-
尝试将
-verbosity:diag添加到msbuild命令行,也许那里有一些线索。 -
你这是什么意思?构建主项目时删除通用项目的输出文件并删除其他两个A,B项目输出文件?还是您遇到的奇怪行为?
-
更改普通项目的OutDir属性,然后在执行clean target时,并没有删除A和B的输出文件?
-
@PerryQian-MSFT 我的意思是在任何一种情况下它都不会删除 A.lib 和 B.lib(无论我是否更改 Common 的 OutDir)。构建失败后,这 2 个库仍然存在,但两次都删除了 Common.lib - 即使所有 3 个项目的 OutDir 都相同。
-
你的意思是当主项目构建失败时,A、B、Common的输出文件要同时删除?
标签: c++ msbuild visual-studio-2019