【问题标题】:MSBuild deletes one lib file, breaking the build. Visual Studio works fineMSBuild 会删除一个 lib 文件,从而中断构建。 Visual Studio 工作正常
【发布时间】:2021-03-03 02:53:05
【问题描述】:

我有这样的项目依赖项:

Main -> A, Common
A -> B, Common

构建顺序:

Common
B
A
Main

该解决方案在 Visual Studio 2019 中构建良好。但在 MSBuild 中,它构建 Common.libB.libA.lib ... 然后删除 Common.lib,然后尝试(但失败)构建 Main.exe

我尝试更改Common.lib 的输出目录,但每次MSBuild 都会在新位置构建它,然后在构建A.lib 后将其删除。它不会删除A.libB.lib,即使它们与Common.lib 位于同一目录中。我还有另一个解决方案,它具有具有相同依赖项(ABCommon)的不同主项目,但 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


【解决方案1】:

您应该注意构建有一个顺序:Common-->B-->A-->Main

如果 Main 项目有错误,它不会停止 AB 项目的构建,因为它们没有错误。

另外,如果底层工程Common有错误,会破坏整个rebuild过程,删除AMain工程输出文件。

另外,当你尝试更改四个项目的outdir时,你应该右键单击每个项目Properties-->General-->输出目录或者只是修改vcxproj文件的每个outdir属性。当你重建它时,它会删除旧的位置输出文件,然后重新构建。

在我这边,当我运行 msbuild xxx\xxx.sln -t:clean 时,它会删除以前所有旧的输出文件。

如果不是,我认为您当前的项目存在一些问题。请尝试以下步骤:

1)删除这些项目的所有项目引用,然后右键单击相关项目的Reference-->重新添加项目引用

2)重新修改各个vcxproj文件下的outdir属性,然后使其值相同。

3)删除.vs隐藏文件夹和这四个项目的所有输出文件夹。

4) 相反,请运行 msbuild xxx\xxx.sln -t:rebuild 来构建您的解决方案。

另外,如果我的回答不符合你的要求,请把你的问题说得更清楚,用更多的图片,....更详细地描述你的问题。

【讨论】:

  • 首先,感谢您花时间在这方面 - 我会尝试您建议的步骤。澄清一下,所有 4 个项目都编译没有错误;我得到的唯一错误是Common.libLINK : fatal error LNK1181: cannot open input file 在构建过程中被删除。
  • 这行得通!更具体地说,重新添加所有项目引用修复了它(我在干净的结帐时进行了测试)。它在依赖Common 的2 个vcxproj 文件的<ProjectReference> 部分中删除了一行<ReferenceOutputAssembly>false</ReferenceOutputAssembly>;修复了构建。谢谢!
猜你喜欢
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多