MSBuild: 错误 MSB4057:项目中不存在该目标

16
我们正在将编译系统迁移到msbuild,但发现一些项目报告以下错误:

c:\src\libs\a_lib\A\A.vcxproj : error MSB4057: 项目中不存在目标“C”。

c:\src\libs\a_lib\B\B.vcxproj : error MSB4057: 项目中不存在目标“C”。

c:\src\libs\a_lib\C\C.vcxproj : error MSB4057: 项目中不存在目标“C”。

c:\src\libs\a_lib\D\D.vcxproj : error MSB4057: 项目中不存在目标“C”。

编译行为:
msbuild "c:\src\libs\a_lib\a_lib.sln" /nologo "/target:C" /t:build "/p:Configuration=Release" "/p:Platform=Win32"

可以看到,该解决方案有几个项目。项目本身存在于解决方案中,并且可以在VS IDE内编译。此外,其他目标也不会失败(例如:A、B、D)。我们之前的编译行在同一项目上运作正常:
devenv "c:\src\libs\a_lib\a_lib.sln" /project "C" /build /nologo "Release|Win32"
2个回答

25
问题出在项目嵌套在解决方案文件夹中(Tests在这个例子中)。目标名称必须包含这些文件夹的名称 (Tests\C),因此正确的编译行是:
msbuild "c:\src\libs\a_lib\a_lib.sln" /nologo "/target:Tests\C" /t:build "/p:Configuration=Release" "/p:Platform=Win32"

5
这是我需要的答案,但有一个注意事项: 这里所提到的“文件夹”似乎是解决方案文件夹,而不是磁盘文件夹。 Visual Studio要求您在解决方案树中创建自己的文件夹结构,与实际基于磁盘的文件夹结构分开。 我们可能都试图使两者相互模仿,但我有一个文件夹,在解决方案资源管理器中的名称与磁盘上的名称不同。 将解决方案资源管理器中的文件夹重命名为磁盘名称可以解决问题。 假设使用解决方案文件夹名称而不是磁盘名称也可以起作用。 - BRebey
1
@BRebey 感谢您指出这一点。确实,在我的情况下,文件夹就像您所提到的那样,只是一个解决方案文件夹(而不是磁盘文件夹)。我已经更新了答案以反映这一点。 - cbuchart
@cbuchart 谢谢,现在终于可以工作了。我的项目在解决方案文件夹中,必须用引号指定! - Houcheng
1
请注意您必须使用反斜杠。使用正斜杠(/)是不起作用的。 - Jan
我遇到了同样的问题,但我不理解这个解决方案。在哪里、什么以及为什么?在这种情况下,“解决方案”是什么意思,而“Disk”文件夹又是什么鬼……有人能简化一下吗?谢谢。 - ThisQRequiresASpecialist
1
@ThisQRequiresASpecialist 对于“解决方案文件夹”,我指的是在VS解决方案中组织项目的文件夹,以区分于文件系统(“磁盘文件夹”)中的目录。 - cbuchart

1
正如其他答案所指出的那样,问题与msbuild未找到目标项目有关。除了路径错误之外,还有另一个潜在原因:多目标。
在非SDK风格项目中引用SDK风格项目时,如果同时针对net461和netstandard2.0,则可能会发生这种情况。在这种情况下,您可能需要通过定义项目引用的目标框架来扩展非SDK风格项目中的项目引用:
<ProjectReference Include="..\..\myProjRef.csproj">
  <Project>{d1b31534-48ae-428e-a174-b679fda90dde}</Project>
  <Name>MyProjRef</Name>
  <AdditionalProperties>TargetFramework=net461</AdditionalProperties>
</ProjectReference>

注意,指定的<AdditionalProperties>TargetFramework=net461导致在MyProjRef项目内部具体指向目标并消除了错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接