如何使用PGI / PGO在MSBuild(仅限命令行)中构建解决方案,而无需向项目添加新的构建配置? 我试图添加命令行参数/属性:WholeProgramOptimization = PGInstrument看起来没问题,它创建了PGD文件,但在运行应用程序后却没有创建PGC。显然我在MSBuild命令行中遗漏了一些东西。
答案 0 :(得分:3)
我花了两天时间在这个问题上摸不着头脑,我终于找到了如何做到这一点:
首先,您需要构建程序的检测版本:
msbuild.exe
/t:Rebuild "Letter:\path\YourProject.vcxproj"
/p:Configuration=Release
/p:Platform=x64
/p:WholeProgramOptimization=PGInstrument
请注意,在我的机器上,可以在此处找到MSBuild:
C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe
。参数的顺序非常重要。如果您的项目放在/ p选项之后,它可能会覆盖它们。
应该在输出目录中创建一个pgd文件。稍后您将需要它的路径。
然后你需要检测程序:
Letter:\path\OutPutDir\YourProject.exe
显然,您需要在此步骤中添加参数,以便为您的程序提供所需的数据。如果您的程序抱怨无法访问pgort120.dll,您可以在脚本中添加类似这样的行:set PATH=%PATH%;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64
最后,您可以构建程序的优化版本:
msbuild.exe
/t:LibLinkOnly "Letter:\path\YourProject.vcxproj"
/p:Configuration=Release
/p:Platform=x64
/p:WholeProgramOptimization=PGOptimize
/p:LinkTimeCodeGeneration=PGOptimization
/p:ProfileGuidedDatabase="Letter:\path\OutPutDir\YourProject.pgd"
在这里,您需要使用第一步的pgd文件的地址。请注意,目标是LibLinkOnly,因为无需重新编译所有内容。
希望这有助于其他人。
答案 1 :(得分:1)
在Arnaud的《答案》的基础上,如果没有它,我将永远无法弄清楚,还有一些其他设置可能会有用。在我的解决方案中,我只想使用PGO构建20个以上的项目,这需要附加标志来防止所有引用的项目被构建:
/p:BuildProjectReferences=false
使用此选项停止由Rebuild目标构建的目标项目引用的项目。
在VS2019中,您会发现pgort140.dll埋在以下位置: Microsoft Visual Studio \ 2019 \专业版\ VC \ Tools \ MSVC \ 14.21.27702 \ bin \ HostxNN \ xNN 文件夹,其中xNN根据需要是x86或x64。
对于解决方案,您可能有一个$(OutDir)输出位置,该位置取决于解决方案设置,但是当您构建单独的项目时,最终位置错误,因此您都可能需要告诉Project文件输出的位置:
/p:OutDir="path to output"
在我的情况下,一个解决方案文件包含许多项目,而我需要使用PGO运行一个解决方案文件,最后我得到了一个批处理文件(请参见下文)。在这种情况下,我在顶层 解决方案文件MyApp.sln包含子文件夹中的许多子项目。的 我想要的一个称为subproj,它与项目文件一起位于subprob文件夹中 在该文件夹中称为subproj.vcxproj。每个子项目都会生成一个DLL, 是subproj对其他子项目的依赖。批处理文件的要点是 如下:
REM Get the folder we are running out of, assumed to hold the solution file
SET parent=%~dp0
REM Set PLATFORM=x64, TOOLS=HOSTx64\x64 for 64-bits
SET PLATFORM=Win32
SET TOOLS=Hostx86\x86
ECHO Build %PLATFORM% Release of MyApp with PGO of the subprog project
REM Expanding Program Files (x86) causes problems so use PROGRA~2
SET VSPATH=C:\PROGRA~2\Microsoft Visual Studio\2019\Professional
SET VSTOOLS=%VSPATH%\VC\Tools\MSVC\14.21.27702\bin
if not exist "%VSTOOLS%" (
ECHO %VSTOOLS% Was not found. This is probably due to a new release. Please
ECHO find the new location and correct this batch file:
ECHO %parent%%me%.bat
exit /b 1
)
REM Set tools path (needed to locate the pgoNnn.dll used for PGO)
set PATH=%PATH%;%VSTOOLS%\%TOOLS%
REM MSB is the path to the MSBuild.exe command
SET MSB="%VSPATH%\MSBuild\Current\Bin\MSBuild.exe"
REM OPT is the common options shared by everything
REM /v: n=normal, m=minimal, q=quiet
SET OPT=/v:m /p:Configuration=Release /p:Platform=%PLATFORM%
REM Set where our output must go. VS likes it to end with \ for $(OutDir)
SET OUTDIR=%parent%%PLATFORM%\Release\
REM It is easier to build everything and rebuild subproj that build all the
REM sub-projects separately.
echo Build the entire solution in the Release build for the desired platform.
%MSB% MyApp.sln %OPT%
echo Now instrument the subproj
%MSB% /t:Rebuild "subproj\subproj.vcxproj" %OPT% /p:OutDir=%OUTDIR% /p:WholeProgramOptimization=PGInstrument /p:BuildProjectReferences=false
echo Run MyApp to exercise the subproj DLL as needed to generate the PGO database
%parent%%PLATFORM%\Release\MyApp.exe arguments as required...
echo Now build PGO optimized version of subproj
%MSB% /t:LibLinkOnly "subproj\subproj.vcxproj" %OPT% /p:WholeProgramOptimization=PGOptimize /p:LinkTimeCodeGeneration=PGOptimization /p:OutDir=%OUTDIR% /p:ProfileGuidedDatabase="%OUTDIR%compiler.pgd"