Visual Studio 文档
https://docs.microsoft.com/zh-cn/visualstudio/
MSBuild (Visual C++)
https://msdn.microsoft.com/zh-cn/library/dd293626.aspx
可以使用 MSBuild 工具从命令提示符处生成 Visual C++ 应用程序。 该生成过程由您可以创建和编辑的项目文件 (.vcxproj) 中的信息来控制。 该项目文件基于生成阶段、条件和事件指定生成选项
MSBuild (Visual C++) 概述
https://msdn.microsoft.com/zh-cn/library/ee662426.aspx
用户目标和属性
若要在命令行上最有效地使用 MSBuild,最好先了解哪些属性和目标是有用且相关。 大多数属性和目标可以帮助实施 Visual c + + 生成系统,并因此不与用户相关。 本部分介绍一些值得面向用户的属性和目标。
PlatformToolset 属性
PlatformToolset 属性确定在生成中使用的 Visual c + + 工具集。 属性的值与字符串组合成包含生成用于特定平台的项目所需的属性和目标文件的目录路径串联。
设置 PlatformToolset 属性设置为 v110 使用 Visual Studio 2012 中的 Visual C++ 工具和库来构建您的应用程序。
msbuild myProject.vcxproj /p:PlatformToolset=v110
设置 PlatformToolset 属性设置为 v100 使用 Visual C++ 2010 工具和库来构建您的应用程序。
msbuild myProject.vcxproj /p:PlatformToolset=v100
设置 PlatformToolset 属性设置为 v90 使用 Visual c + + 2008年工具和库来生成你的应用程序。 此属性才有效在计算机上必须已安装的 Visual c + + 2008年工具集。
msbuild myProject.vcxproj /p:PlatformToolset=v90
PreferredToolArchitecture 属性
PreferredToolArchitecture 属性确定是否在生成中使用 32 位或 64 位编译器和工具。 此属性不影响输出的平台体系结构或配置。 默认情况下,MSBuild 使用 x86 版本的编译器和工具,如果此属性未设置,或为设置为任何值以外 x64。
设置 PreferredToolArchitecture 属性设置为 x64 以使用 64 位编译器和工具来生成应用程序。
msbuild myProject.vcxproj /p:PreferredToolArchitecture=x64
UseEnv 属性
默认情况下,当前项目的特定于平台的设置重写路径、 INCLUDE、 LIB、 LIBPATH、 配置和平台环境变量。 设置 UseEnv 属性设置为 true 若要确保环境变量不重写。
msbuild myProject.vcxproj /p:UseEnv=true
目标
有数百个 Visual c + + 支持文件中的目标。 但是,大多数都是用户可忽略的面向系统的目标。 大多数系统目标前缀是下划线 (_),或具有”PrepareFor”,”计算”,以”Before”,”After”,”之前”或”Post”开头的名称。
下表列出了几个值得面向用户的目标。
MSBuild 命令行参考
https://msdn.microsoft.com/zh-cn/library/ms164311.aspx
MSBuild.exe [Switches] [ProjectFile]
语法: MSBuild.exe [选项] [项目文件]
描述: 在项目文件中生成指定的目标。如果
未指定项目文件,MSBuild 将搜索
当前工作目录来查找文件扩展名
以“proj”结尾的文件并使用该文件。
开关:
/target:<targets> 在此项目中生成这些目标。使用
分号或逗号分隔多个目标,或者分别指定
每个目标。(缩写: /t)
示例:
/target:Resources;Compile
/property:<n>=<v> 设置或重写这些项目级属性。<n> 是
属性名,<v> 为属性值。请使用
分号或逗号分隔多个属性,或者
分别指定每个属性。(缩写: /p)
示例:
/property:WarningLevel=2;OutDir=bin\Debug\
/maxcpucount[:n] 指定用于生成的最大
并发进程数。如果未使用开关,则使用的默认值
为 1。如果使用开关时不带值,
MSBuild 将最多使用计算机上的
处理器数。(缩写: /m[:n])
/toolsversion:<version>
要在生成过程中使用的 MSBuild 工具集
(任务、目标等) 的版本。此版本将重写
个别项目指定的版本。(缩写:
/tv)
示例:
/toolsversion:3.5
/verbosity:<level> 在事件日志中显示此级别的信息量。
可用的详细级别有: q[uiet]、 m[inimal]、
n[ormal]、d[etailed] 和 diag[nostic]。(缩写: /v)
示例:
/verbosity:quiet
/consoleloggerparameters:<parameters>
控制台记录器的参数。(缩写: /clp)
可用的参数有:
PerformanceSummary -- 显示在任务、目标和项目上
花费的时间。
Summary -- 结束时显示错误和警告的摘要。
NoSummary -- 结束时不显示错误和警告
的摘要。
ErrorsOnly -- 仅显示错误。
WarningsOnly -- 仅显示警告。
NoItemAndPropertyList -- 在开始生成每个项目时不显示
项和属性的列表。
ShowCommandLine -- 显示 TaskCommandLineEvent 消息
ShowTimestamp -- 将时间戳作为所有消息的前缀
显示。
ShowEventId -- 显示已开始事件、已完成事件和消息
的事件 ID。
ForceNoAlign -- 不将文本与控制台缓冲区的大小
匹配。
DisableConsoleColor -- 将默认控制台颜色
用于所有记录消息。
DisableMPLogging -- 在非多处理器
模式下运行时,禁用输出的多处理器
日志记录样式。
EnableMPLogging -- 即使在非多处理器
模式下运行,也启用多处理器
日志记录样式。默认情况下启用此日志记录样式。
Verbosity -- 重写此记录器的 /verbosity
设置。
示例:
/consoleloggerparameters:PerformanceSummary;NoSummary;
Verbosity=minimal
/noconsolelogger 禁用默认控制台记录器,并且不将事件
记录到控制台。(缩写: /noconlog)
/fileLogger[n] 将生成输出记录到文件中。默认情况下,
该文件在当前目录中,名称为
“msbuild[n].log”。所有节点中的事件合并到
单个日志中。fileLogger 的文件和
其他参数的位置可以通过添加
“/fileLoggerParameters[n]”开关来指定。
“n”(如果存在)可以为 1-9 的数字,允许最多附加
10 个文件记录器。(缩写: /fl[n])
/fileloggerparameters[n]:<parameters>
为文件记录器提供任何额外的参数。
存在此开关意味着
存在对应的 /filelogger[n] 开关。
“n”(如果存在)可以为 1-9 的数字。
任何分布式文件记录器也可以使用
/fileloggerparameters,具体可参阅 /distributedFileLogger 的说明。
(缩写: /flp[n])
为控制台记录器列出的相同参数
可用。某些其他可用参数有:
LogFile -- 生成日志将写入其中的
日志文件的路径。
Append -- 确定是将生成日志附加到日志文件,
还是覆盖日志文件。如果设置此
开关,则会将生成日志附加到日志文件;
如果不设置此开关,则会覆盖
现有日志文件的内容。
默认值为不附加到日志文件。
Encoding -- 指定文件的编码,
例如,UTF-8、Unicode 或 ASCII
默认的详细级别为 Detailed。
示例:
/fileLoggerParameters:LogFile=MyLog.log;Append;
Verbosity=diagnostic;Encoding=UTF-8
/flp:Summary;Verbosity=minimal;LogFile=msbuild.sum
/flp1:warningsonly;logfile=msbuild.wrn
/flp2:errorsonly;logfile=msbuild.err
/distributedlogger:<central logger>*<forwarding logger>
使用此记录器来记录 MSBuild 中的事件,向每个节点
附加不同的记录器实例。若要指定
多个记录器,请分别指定每个记录器。
(缩写 /dl)
<logger> 语法为:
[<logger class>,]<logger assembly>[;<logger parameters>]
<logger class> 语法为:
[<partial or full namespace>.]<logger class name>
<logger assembly> 语法为:
{<assembly name>[,<strong name>] | <assembly file>}
<logger parameters> 是可选的,并且按键入的
形式原样传递给记录器。(缩写: /l)
示例:
/dl:XMLLogger,MyLogger,Version=1.0.2,Culture=neutral
/dl:MyLogger,C:\My.dll*ForwardingLogger,C:\Logger.dll
/distributedFileLogger
将生成输出记录到多个日志文件,每个 MSBuild 节点
一个日志文件。这些文件的初始位置为
当前目录。默认情况下,这些文件名为
“MSBuild<nodeid>.log”。可通过添加
“/fileLoggerParameters”开关来指定
这些文件的位置和 fileLogger 的其他参数。
如果日志文件名是通过 fileLoggerParameters
开关设置的,分布式记录器将使用 fileName 作为
模板并将节点 ID 附加到此 fileName
以便为每个节点创建一个日志文件。
/logger:<logger> 使用此记录器来记录 MSBuild 中的事件。若要指定
多个记录器,请分别指定每个记录器。
<logger> 语法为:
[<logger class>,]<logger assembly>[;<logger parameters>]
<logger class> 语法为:
[<partial or full namespace>.]<logger class name>
<logger assembly> 语法为:
{<assembly name>[,<strong name>] | <assembly file>}
<logger parameters> 是可选的,并按键入的
形式原样传递给记录器。(缩写: /l)
示例:
/logger:XMLLogger,MyLogger,Version=1.0.2,Culture=neutral
/logger:XMLLogger,C:\Loggers\MyLogger.dll;OutputAsHTML
/validate 依据默认架构验证项目。(缩写:
/val)
/validate:<schema> 依据指定的架构验证项目。 (缩写:
/val)
示例:
/validate:MyExtendedBuildSchema.xsd
/ignoreprojectextensions:<扩展名>
确定要生成的项目文件时要忽略的
扩展名的列表。使用分号或逗号来分隔
多个扩展名。
(缩写: /ignore)
示例:
/ignoreprojectextensions:.sln
/nodeReuse:<parameters>
允许或禁止重复使用 MSBuild 节点。
参数包括:
True -- 生成完成后节点将保留,
并且将由后面的生成重复使用(默认)
False -- 生成完成后节点将不会保留
(缩写: /nr)
示例:
/nr:true
/preprocess[:file]
通过嵌入将在生成过程中导入的
所有文件并标记其边界,
创建一个聚合的项目文件。这对于
了解导入什么文件、从何处导入以及
这些文件在生成中的构成
非常有用。默认情况下,输出将写入
控制台窗口。如果提供输出文件的路径,
则将改用该路径。
(缩写: /pp)
示例:
/pp:out.txt
/detailedsummary
在生成的结尾显示有关
所生成的配置以及如何向节点安排
这些配置的详细信息。
(缩写: /ds)
@<file> 从文本文件插入命令行设置。若要指定
多个响应文件,请分别指定每个响应
文件。
自动从以下位置使用任何
名为“msbuild.rsp”的响应文件:
(1) msbuild.exe 的目录
(2) 生成的第一个项目或解决方案的目录
/noautoresponse 不自动包括任何 MSBuild.rsp 文件。(缩写:
/noautorsp)
/nologo 不显示启动版权标志和版权消息。
/version 仅显示版本信息。(缩写: /ver)
/help 显示此用法消息。(缩写: /? 或 /h)
示例:
MSBuild MyApp.sln /t:Rebuild /p:Configuration=Release
MSBuild MyApp.csproj /t:Clean
/p:Configuration=Debug;TargetFrameworkVersion=v3.5
示例
MSBuild.exe MyProject.proj /t:rebuild
演练:使用 MSBuild 创建 Visual C++ 项目
https://msdn.microsoft.com/zh-cn/library/dd293607.aspx
msbuild myproject.vcxproj /p:configuration=debug
msbuild myproject.vcxproj /t:clean
将 MSBuild 与生成目标结合使用
生成目标是指定的一组预定义命令或用户定义的命令,这组命令可在生成期间执行。 使用目标命令行选项 (/t) 可以指定生成目标。 对于 myproject 示例项目,预定义的 clean 目标将删除调试文件夹中的所有文件并创建新日志文件。
在命令提示符处,键入以下命令以清理 myproject。
msbuild myproject.vcxproj /t:clean
将 MSBuild 与生成属性结合使用
通过使用属性命令行选项 (/p),您可以在项目生成文件中重写属性。 在 myproject 示例项目中,发布版本配置或调试版本配置是由 Configuration 属性指定的。 用来运行生成的应用程序的操作系统是由 Platform 属性指定的。
在命令提示符处,键入以下命令,以创建打算在 32 位 Windows 上运行的 myproject 应用程序的调试版本。
msbuild myproject.vcxproj /p:configuration=debug /p:platform=win32
假设 myproject 示例项目也为 64 位 Windows 定义了配置,并为名为 myplatform 的自定义操作系统定义了另一个配置。
在命令提示符处,键入以下命令,以创建在 64 位 Windows 上运行的发布版本。
msbuild myproject.vcxproj /p:configuration=release /p:platform=x64
在命令提示符处,键入以下命令以为 myplatform 创建发布版本。
msbuild myproject.vcxproj /p:configuration=release /p:platform=myplatform
个人写的例子:
vs2005:
call "D:\Program Files (x86)\Microsoft Visual Studio 8\VC\vcvarsall.bat" x86
vs2010:
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
vs2012:
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86
重新编译:
MSBuild %~dp0..\Project\VC10\pro.sln /t:rebuild /p:configuration="Release"
在命令行上生成
https://msdn.microsoft.com/zh-cn/library/f35ctcxw.aspx
为命令行生成设置路径和环境变量
https://msdn.microsoft.com/zh-cn/library/f2ccy3wt.aspx
生成应用程序
https://msdn.microsoft.com/zh-cn/library/ms181709.aspx
vcvars.bat 设置命令行编译环境
@echo off
if defined VSINSTALLDIR (
echo already installed
goto eof
)
set "_ARG_=%1"
rem help
if "%_ARG_%" EQU "" (
echo syntax: %0 [2005 ^| 2008 ^| 2010 ^| 2012 ^| 2013 ^| 2015] [64]
goto eof
)
if "%_ARG_%" EQU "2005" set "ProgramFiles(x86)=%VS80COMNTOOLS%..\..\"
if "%_ARG_%" EQU "2008" set "ProgramFiles(x86)=%VS90COMNTOOLS%..\..\"
if "%_ARG_%" EQU "2010" set "ProgramFiles(x86)=%VS100COMNTOOLS%..\..\"
if "%_ARG_%" EQU "2012" set "ProgramFiles(x86)=%VS110COMNTOOLS%..\..\"
if "%_ARG_%" EQU "2013" set "ProgramFiles(x86)=%VS120COMNTOOLS%..\..\"
if "%_ARG_%" EQU "2015" set "ProgramFiles(x86)=%VS140COMNTOOLS%..\..\"
echo "%ProgramFiles(x86)%"
if NOT DEFINED ProgramFiles(x86) set ProgramFiles(x86)=C:\Program Files (x86)
if NOT DEFINED VS80COMNTOOLS set VS80COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\
if NOT DEFINED VS90COMNTOOLS set VS90COMNTOOLS=c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
rem VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\
rem VS110COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
rem VS120COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
rem VS140COMNTOOLS=D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\
rem VS80COMNTOOLS=D:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\
rem VS90COMNTOOLS=D:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
rem VSSDK140Install=D:\Program Files (x86)\Microsoft Visual Studio 14.0\VSSDK\
set "_OPT_=%2"
if NOT DEFINED _OPT_ set _OPT_=64
if "%_OPT_%" EQU "x64" set "_OPT_=64"
if "%_ARG_%" EQU "2005" (
if "%_OPT_%" EQU "64" (
pushd "%ProgramFiles(x86)%\VC\bin\amd64\"
call vcvarsamd64.bat
set PROCESSOR_ARCHITECTURE=AMD64
) else (
pushd "%ProgramFiles(x86)%\VC\bin"
call vcvars32.bat
set PROCESSOR_ARCHITECTURE=x86
)
popd
goto eof
)
rem set the variable _VC_
set _VC_=
if "%_ARG_%" EQU "2008" set "_VC_=9.0"
if "%_ARG_%" EQU "2010" set "_VC_=10.0"
if "%_ARG_%" EQU "2012" set "_VC_=11.0"
if "%_ARG_%" EQU "2013" set "_VC_=12.0"
if "%_ARG_%" EQU "2015" set "_VC_=14.0"
if DEFINED _VC_ (
echo "%ProgramFiles(x86)%\VC\"
pushd "%ProgramFiles(x86)%\VC\"
if "%_OPT_%" EQU "64" (
vcvarsall.bat x86_amd64
set PROCESSOR_ARCHITECTURE=AMD64
) else (
vcvarsall.bat x86
set PROCESSOR_ARCHITECTURE=x86
)
if errorlevel 1 (
echo.*** error - failed ***
) else (
echo Success Environment for Visual Studio %_VC_% = %*
)
popd
) else (
echo unknown version of Visual Studio %*
set _ARG_=
call:help
)
rem
rem That's all Folks!
:eof
MSBuild编译
call "%~dp0\vcvars.bat" 2005|2008|2010|2012|2013|2015 x86|x64
MSBuild %~dp0..\Project\pro.sln /t:rebuild /p:configuration="Release"
MSBuild "%~dp0..\Project\pro.sln" /t:clean
devenv
@echo off
cd /d %~dp0
set BUILD_TARGET=%CD%\MyProject.sln
echo.
if ""=="%VS80COMNTOOLS%" (
echo environment variable 'VS80COMNTOOLS%' has not been set
goto Exit_Fail
)
set DEVENV=%VS80COMNTOOLS%\..\IDE\devenv.com
if not exist "%DEVENV%" (
echo file "%DEVENV%" can not be found
goto Exit_Fail
)
@echo on
"%DEVENV%" "%BUILD_TARGET%" /Build Release
:Exit_Fail
pause
Build
可换成Rebuild
使用devenv/MSBuild在命令行编译sln或csproj
VS对应MSBuild目录
- vs2005 C:\Windows\Microsoft.NET\Framework\v2.0.50727
- vs2010 C:\Windows\Microsoft.NET\Framework\v4.0.30319 v100