0

Visual Studio 2012 でこの順序でプロジェクトをビルドする方法を探しています (C++ ですが、一般的な質問かもしれません)。

  • ProjectA をコンパイルします (.obj だけが必要です)
  • ProjectB のコンパイルとリンク
  • プロジェクトAをリンク

ProjectA のリンクが早すぎるため、ProjectB で ProjectA の参照/依存関係を単純に使用することはできません。

私はこのようにVS 2008でこれを行っていました:

  • ProjectB の PreBuild イベント: vcbuild /pass0 /pass1ProjectA
  • ProjectB (ProjectA の依存関係) をコンパイルしてリンクします。
  • ProjectA をコンパイルして (既にビルドされているため、実際には何もしません)、リンクします。

しかし、vcbuild は VS 2012 からなくなったので、コマンドを次のように置き換えました。

msbuild /t:BuildGenerateSources /t:BuildCompile

ここでの問題は、リンクのみが想定されている 3 番目のステップで (msbuild が既にコンパイルされているため)、ProjectA を再度コンパイルしてからリンクすることです。msbuild で診断の冗長性を有効にすると、次のことがわかりました。前回のビルド以降のコマンド ラインの変更により、すべてのソース ファイルを強制的に再ビルドします。. そして、比較されている2つのコマンドを確認することは不可能であるため、ほとんど誰も(Visual Studio 2010がランダムにコマンドラインが変更され、再構築すると言います)、これに対する解決策を持っていません.

私が探していることを Visual Studio で直接実行する (コマンド ラインで msbuild を起動するビルド前のイベントを使用しない) ことのもう 1 つの利点は、コンパイル エラーが [エラー] リストに報告され、[出力] ウィンドウでクリックできるようになることです。

内部的には、vcxprojs で指定された msbuild と Targets を使用する可能性がありますが、それが実行可能かどうかを知りたいです。

編集: msbuild を呼び出すコマンドを devenv に置き換えようとしましたが、コンパイルのみ (リンクなし) を指定できる devenv のスイッチがないため、どちらも使用できません。

Edit2:誰かがすでにここで同様のことを尋ねているように聞こえます (解決策はありません)リンクせずに Visual Studio C++ でオブジェクトをコンパイルすることは可能ですか?

4

1 に答える 1

1

わかりましたので、.vcxproj の BuildStepsをオーバーライドし、ターゲット BuildLink を削除することで実行できます。

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
      <BuildSteps Condition="'$(BuildSteps)' == '' or '$(SkipLink)'!='false'">
            ResolveReferences;
            PrepareForBuild;
            InitializeBuildStatus;
            BuildGenerateSources;
            BuildCompile;
            <!-- BuildLink; -->
      </BuildSteps>
</PropertyGroup>

VS がビルドするとき、リンク ステップは実行されません。元の BuildSteps はC:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.BuildSteps.targetで定義されています

後でコマンド ラインでプロジェクトを最終的にリンクするには (たとえば、別のプロジェクトのビルド イベントから)、次のように呼び出します。

msbuild /t:BuildLink /p:VisualStudioVersion=11.0 /p:Configuration=Debug /p:Platform=x64 /p:SkipLink=false "ProjectA.vcxproj"

条件 SkipLink が BuildSteps オーバーライドに追加されていることに注意してください。これにより、いつ BuildLink を実行し、いつ実行しないかを指定できます。

于 2013-03-18T17:33:39.513 に答える