UseLibraryDependencyInputs
Microsoft.CppBuild.targetsを調べたところ、プロジェクトが StaticLibrary の場合にのみ、VS で「ライブラリ依存関係入力の使用」をチェックすることに対応する、true に設定されたプロジェクトの .obj ファイルが含まれていることがわかりました。
ResolvedLinkObjs
これを回避する手っ取り早い方法は、.vcxproj 内のタスクをわずかに変更してオーバーライドすることです。
これをテストしたところ、参照したプロジェクトのすべての .obj ファイルをリンクできました。
MSBuild タスク出力ItemName
のを変更し、渡されたsに追加しました。このターゲットを呼び出している間に .exe プロジェクトを扱うことの副作用はすぐにはわかりませんが、悪いことは何も気づいていません。TargetOutputs
"ProjectReferenceToLink"
ConfigurationType=StaticLibrary
Propertie
StaticLibrary
<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 を取得するように簡単に変更できます。よりクリーンな方法には、おそらく、このように組み込みのターゲットをオーバーライドするのではなく、チェーンに挿入することも含まれます。