5

組み込み単体テストを含んでいた実行可能な C++ プロジェクトがあります。VS Test Runner で使用するために、テストを別の (.dll) プロジェクトに移動しました。未解決の外部シンボル エラーを除いて、すべて問題ありません。

すべての .obj ファイルを .exe から .dll にリンクするとうまくいくように見えますが、リストは常に変更される可能性があるため、ファイルの数が多く、ハードコードするのは非常に「汚い」ことになります。

.exe プロジェクトを参照として追加し、「use Library Dependency Inputs」を True に設定しようとしましたが、何もしないようです。

4

2 に答える 2

4

UseLibraryDependencyInputsMicrosoft.CppBuild.targetsを調べたところ、プロジェクトが StaticLibrary の場合にのみ、VS で「ライブラリ依存関係入力の使用」をチェックすることに対応する、true に設定されたプロジェクトの .obj ファイルが含まれていることがわかりました。

ResolvedLinkObjsこれを回避する手っ取り早い方法は、.vcxproj 内のタスクをわずかに変更してオーバーライドすることです。

これをテストしたところ、参照したプロジェクトのすべての .obj ファイルをリンクできました。

MSBuild タスク出力ItemNameのを変更し、渡されたsに追加しました。このターゲットを呼び出している間に .exe プロジェクトを扱うことの副作用はすぐにはわかりませんが、悪いことは何も気づいていません。TargetOutputs"ProjectReferenceToLink"ConfigurationType=StaticLibraryPropertieStaticLibrary

  <Target Name="ResolvedLinkObjs" DependsOnTargets="$(CommonBuildOnlyTargets)">
    <MSBuild Projects="@(_MSBuildProjectReferenceExistent)"
             Targets="GetResolvedLinkObjs"
             BuildInParallel="$(BuildInParallel)"
             Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform); ConfigurationType=StaticLibrary"
             Condition="'%(_MSBuildProjectReferenceExistent.Extension)' == '.vcxproj' and '@(ProjectReferenceWithConfiguration)' != '' and '@(_MSBuildProjectReferenceExistent)' != ''"
             ContinueOnError="!$(BuildingProject)"
             RemoveProperties="%(_MSBuildProjectReferenceExistent.GlobalPropertiesToRemove)">
      <Output TaskParameter="TargetOutputs" ItemName="ProjectReferenceToLink" />
    </MSBuild>
  </Target>

これは、1 つのプロジェクトから .obj を取得するように簡単に変更できます。よりクリーンな方法には、おそらく、このように組み込みのターゲットをオーバーライドするのではなく、チェーンに挿入することも含まれます。

于 2014-03-20T23:06:34.403 に答える
-1

本当にもっと情報が必要です。

しかし、私は解決策を突き刺します。

実行可能ファイルと単体テストに必要な機能を含むライブラリを作成します。

つまり、ライブラリと 2 つの実行可能ファイルができてしまいます。1 つは製品で、もう 1 つは単体テストを含む実行可能ファイルですか?

于 2014-03-20T04:41:40.830 に答える