プロジェクトに新しいビルド構成を追加せずに、PGI / PGOを使用してMSBuild(コマンドラインのみ)でソリューションをビルドするにはどうすればよいですか?コマンドラインパラメーター/property:WholeProgramOptimization = PGInstrumentを追加しようとしましたが、これは問題ないように見えます。アプリケーションを実行した後、PGDファイルは作成されますが、PGCは作成されません。明らかに、MSBuildコマンドラインに何かが欠けています。
2 に答える
私はこの問題に頭を悩ませるのに2日間を費やし、ついにそれを行う方法を見つけました。
まず、プログラムのインストルメント化されたバージョンをビルドする必要があります。
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であることに注意してください。
これが他の人に役立つことを願っています。
Arnaudからの回答に基づいて、これがなければ私はこれを理解できなかったでしょう。便利な追加の設定があります。私のソリューションでは、PGOを使用して20以上から1つのプロジェクトをビルドしたかっただけで、参照されているすべてのプロジェクトがビルドされないようにするために追加のフラグが必要でした。
/p:BuildProjectReferences=false
これを使用して、Rebuildターゲットによってビルドされているターゲットプロジェクトによって参照されるプロジェクトを停止します。これを/t:RebuildコマンドとVS16.8.0以降の/t:LibLinkOnlyコマンドの両方に追加する必要があります。
VS2019では、pgort140.dllがMicrosoft Visual Studio \ 2019 \ Professional \ VC \ Tools \ MSVC \ 14.21.27702 \ bin \ HostxNN \ xNNフォルダーに埋め込まれています。ここで、xNNはx86またはx64です。
ソリューションの場合、ソリューション設定に応じて$(OutDir)の出力場所が存在する可能性がありますが、別のプロジェクトをビルドすると間違った場所に配置されるため、プロジェクトに通知する必要があります。出力が含まれるファイル:
/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
REM Value for VS 16.?.? = \14.21.27702
REM Value for VS 16.3.2 = \14.22.27905\bin
REM Value for VS 16.3.3 = \14.23.28105\bin
REM Value for VS 16.4.0 = \14.24.28314\bin
REM Value for VS 16.5.0 = \14.25.28610
REM Value for VS 16.6.0 = \14.26.28801
REM Value for VS 16.7.0 = \14.27.29110
REM Value for VS 16.8.0 = \14.28.29333
SET VSTOOLS=%VSPATH%\VC\Tools\MSVC\14.21.278.29333\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" /p:BuildProjectReferences=false