3

多くのプロジェクトファイルとソリューションファイルを含むVisualStudio2010を使用しています。しかし今、私はProjectReferencesで少し依存関係地獄にいることに気づきました。

  • プロジェクトSimpleは静的ライブラリを生成します。
  • Fooに依存BarSimple、静的ライブラリを生成します。
  • プロジェクトはDLLModuleに依存しFoo、DLLを生成します。
  • プロジェクトはDLLModule2に依存しBar、DLLを生成します。

したがって、依存関係ツリーは次のようになります。

                Simple
                  |
     ____________/ \__________
     |                        |
    Foo                      Bar
     |                        |
   Module                   Module2

を使用すると、依存して自動的にリンクProjectReferencesすることができます。これは正常に機能します。ModuleFooFoo.lib

しかしModule、自動的にリンクする方法はありSimple.libますか?

それは可能だと思われます。 Moduleに依存しますFoo。これはに依存しますSimple。したがって、「私の参照と私の参照の参照の出力にリンクする」オプションがあるはずです。しかし、それを可能にするものは何も見つかりません。

「リンクライブラリの依存関係」オプションはそれを行いません。Foo.libでのみリンクし、未解決の外部シンボル(Simple.libで定義されているシンボル)に関するリンクエラーが発生します。

->および->参照trueに対して「リンクライブラリの依存関係」をに設定すると、との両方を使用するプロジェクトができるまで、最初は機能するようです。その設定は実際にはとの中に埋め込まれ、との両方を使用しようとすると「シンボルはすでに定義されています」というエラーが発生します。そして、それは正しいエラーです-私は実際には他のライブラリの中に入れたくありません。FooSimpleBarSimpleFooBarSimple.libFoo.libBar.libFoo.libBar.libSimple.lib

ProjectReferecefromModuleをtoに追加することはできますがSimple、を使用するすべてのプロジェクトに設定するのは面倒でFooあり、のカプ​​セル化に違反していますFooModuleについて知る必要はありませんSimple。明らかに、リンカはについて知る必要がありますがSimple、ProjectReferencesに従うことでそれを理解できるはずです。

これが重要な理由は次のとおりです。メンテナンス中に Basic、静的libを作成し、にSimple依存する新しいプロジェクトが作成されたとしBasicます。ProjectReferenceここで、をSimple直接または別のProjectReferenceを介して持つすべてのプロジェクトを更新する必要があります(この例ではModule、 2つのプロジェクトのみModule2ですが、実際には数十です)。それは退屈です。

tl; dr依存関係の静的ライブラリに自動的にリンクする方法はありますか?

4

1 に答える 1

1

どうやら、これはVisual Studio 2010のバグです: https ://connect.microsoft.com/VisualStudio/feedback/details/638534/unresolved-externals-when-build-a-vc-project-with-chained-static-lib -dependencies#details

残念ながら、Microsoftはバグを「修正済み」としてクローズしましたが、これは完全には真実ではありません。これは回避策のようなものですが、私が実際の修正と見なすものではありません。(実際の修正はパッチまたはサービスパックであり、すべてのマシンで手動で調整する必要があるものではありません)。

「修正」とは、次のことを行うことです。

%ProgramFiles(x86)%\MSBuild\Microsoft.cpp\v4.0\Microsoft.CPPBuild.Targets を変更して変更します。

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)"
 DependsOnTargets="$(CommonBuildOnlyTargets)">

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)"
 DependsOnTargets="$(CommonBuildOnlyTargets);ResolvedLinkLib">

したがって、;ResolvedLinkLib部分をそのファイルに追加するだけです。次に、VSは依存関係の依存関係にリンクします。

于 2012-08-14T16:31:07.260 に答える