强制使用msbuild构建在解决方案配置中未被选中的项目

14

我在命令行中使用msbuild来构建生成的解决方案文件:

msbuild /p:Configuration=Release /p:Platform=Win32 build\zlib\vc-9.0\x86\zlib.sln

问题在于CMake生成的解决方案中,默认情况下没有构建一个名为“INSTALL”的项目。
minigzip:
  Die Datei "c:\Library\build\zlib\vc-9.0\x86\minigzip.tmp_Release_Win32.vcproj
  " wird gelöscht.
ALL_BUILD:
  Die Datei "c:\Library\build\zlib\vc-9.0\x86\ALL_BUILD.tmp_Release_Win32.vcpro
  j" wird gelöscht.
INSTALL:
  The project "INSTALL" is not selected for building in solution configuration
  "Release|Win32".
Done Building Project "c:\Library\build\zlib\vc-9.0\x86\zlib.sln" (default targ
ets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

如何在不手动打开解决方案并为配置设置复选框的情况下强制构建目标 INSTALL?

一个解决方案是直接调用 vcproj 文件(就像我在这里做的那样)。

msbuild /p:Configuration=Release /p:Platform=Win32 build\zlib\vc-9.0\x86\INSTALL.vcproj

但是这会输出警告信息。
Microsoft (R)-Buildmodul, Version 3.5.30729.6387
[Microsoft .NET Framework, Version 2.0.50727.6400]
Copyright (C) Microsoft Corporation 2007. Alle Rechte vorbehalten.

Build started 06.07.2013 17:07:57.
Project "c:\Library\build\zlib\vc-9.0\x86\INSTALL.vcproj" on node 0 (default ta
rgets).
c:\Library\build\zlib\vc-9.0\x86\INSTALL.vcproj : warning MSB4098: MSBuild is i
nvoking VCBuild to build this project. Project-to-project references between VC
++ projects (.VCPROJ) and C#/VB/VJ# projects (.CSPROJ, .VBPROJ, .VJSPROJ) are n
ot supported by the command-line build systems when building stand-alone VC++ p
rojects. Projects that contain such project-to-project references will fail to
build. Please build the solution file containing this project instead.
Done Building Project "c:\Library\build\zlib\vc-9.0\x86\INSTALL.vcproj" (defaul
t targets).


Build succeeded.

正如您所见,构建成功了。通过先调用解决方案,我可以确保正确的构建,但我想强制解决方案也构建项目 INSTALL。

有什么好的想法吗?


1
我非常确定这是不可能的。而且你已经找到的解决方法似乎已经足够好了,不是吗?作为替代方案,你不能使用类似于“cmake --build --target install”这样的东西吗?我已经有一段时间没有使用过cmake了,但我似乎记得你可以让它代替你手动执行msbuild等操作。 - stijn
非常感谢,将此作为答案发布,我会接受它作为有效解决方案。 - Beachwalker
4个回答

12

据我所知,这是不可能的。查看msbuild的命令行选项和解决方案文件,在这些内容中都没有支持此功能的选项。但由于您正在使用cmake,可以使用它来自动构建所有内容,而无需手动操作。我找到了这个主题讨论帖,其中基本上与您提出的相同的问题,并且已经在评论中给出了正确的语法:


cmake --build . --target install

进一步观察,从devenv命令行选项来看,它似乎具备您所需的功能。即使在配置管理器中未启用给定项目,也可以强制构建它:

devenv build\zlib\vc-9.0\x86\zlib.sln /Build Release /project INSTALL

如果您想让CMake以发布模式构建,您可能需要使用以下命令:"cmake --build . --target install --config Release" - debris

5

stijn的回答 是通过cmake构建目标的“惯用”方式。

但需要注意的是,MSbuild可以构建解决方案文件项目文件。不必调用msbuild zlib.sln,您也可以调用msbuild ALL_BUILD.vcxproj

同样,您可以调用msbuild INSTALL.vcxproj


我已经完成了(请看我发布的代码)。但是这会引发警告。 - Beachwalker
1
@Beachwalker。抱歉……它应该可以在VS2010或更高版本中工作。我没有注意到您正在构建“pre-VS2008”vcproj文件…… - André
1
谢谢,这对我在VS2017中的工作非常有效,即使是依赖于主解决方案中其他项目的安装程序项目也可以。 - autonomy

3

使用由CMake版本3.2.2生成的解决方案,通过msbuild无法构建INSTALL目标。根本原因在于,对于INSTALL目标,解决方案仅包含类似于GlobalSection(ProjectConfigurationPlatforms)中条目的条目:

    {11C4D30A-3B6A-4350-BD7D-B343F3A843C0}.Debug|Win32.ActiveCfg = Debug|Win32

如果您添加像这样的条目:
    {11C4D30A-3B6A-4350-BD7D-B343F3A843C0}.Debug|Win32.Build.0 = Debug|Win32

然后就可以使用以下命令构建INSTALL目标:

    msbuild <pathToProject>.sln /target:INSTALL

0

最简单的方法是直接构建项目,但不要忘记指定配置和平台。

msbuild /p:Configuration=Release /p:Platform=Win32 INSTALL.vcxproj


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