10

次の点を考慮してください。

  • 私は静的ライブラリ X を C++ で開発していますが、これは内部的に有名な静的ライブラリ Y v2.0 を使用しています。
  • 私は 1 つのライブラリ X' のみを配布したいと考えています。これは、内部使用のために Y が静的にリンク/マージされた X です。
  • 開発者は、実行可能ファイルで X' を使用したいと考えています。
  • また、彼には Y v1.0 が必要です (私のように v2.0 ではありません)。
  • Y v1.0 と v2.0 にはいくつかの共通のシンボルがあり、これらの共通のシンボルのいくつかは動作も異なります。

私は、一部の内部ビジネスで Y v2.0 を使用するという厳格な要件で X を開発しました。つまり、Y v1.0 に戻すことは絶対にできません。
一方、開発者には Y v1.0 を使用するための同様の制限があります。

すでに議論されているように、問題は、Y シンボルをエクスポートせずに X 内で Y をリンクして衝突を回避するにはどうすればよいかということです。Y は十分に確立されており、おそらくそのソース コードやビルド設定を変更したくありません (公開されている場合)。

物事をもっと地球に置くために、私は確かにサードパーティのライブラリ、たとえばzlibが必要になるSDKを設計中です。私の開発では、zlib v1.2.3.4.5.rc6 に依存します。これは、zlib v1.2.3.4.5.rc6 を広範囲に使用してテストすることに成功しており、バージョンを変更した場合に必要な SDK のテスト/修正を行う余裕がないためです。
SDK が提供する静的または動的にリンクされたすべてのライブラリは、サードパーティの静的ライブラリを非表示にする必要があります。

潜在的な顧客は同様の制限を受ける可能性があります (zlib v7.8.9 が必要です)。では、シンボルの衝突を回避するにはどうすればよいですか? 繰り返しますが、おそらく元のソース コード (名前空間など) を変更する必要はありません。

複雑なことに、SDK はマルチプラットフォームであり、プラットフォーム (Windows、Linux、Mac OS、iOS、Android など) や使用するコンパイラ (MSVC++ や g++ など) に応じて、問題を解決するさまざまな方法が必要になることを意味します。 .

ありがとうございました。

更新
私はこの質問の VENDOR2 のようです: Linking with multiple versions of a library
bstpierre's answer は実行可能な解決策のようですが、それが機能するかどうか、または *nix 以外の OS で再現できるかどうかはわかりません。

4

1 に答える 1

1

この問題は、静的ライブラリで何度も発生しており、最近では MSVCRT で発生しています。あるコメント投稿者が指摘しているように、単一の実行可能ファイルでは、1 つの定義ルールが邪魔になります。バイナリにパッチを当てる以外に、これを回避する方法は本当にありません。そして、これを「深く」行う必要があります-静的ライブラリY(zlib)が独自の外部リンケージオブジェクトに対して行うすべての内部参照をキャッチします。

この場合、動的ライブラリ (DLL または SO) を使用することをお勧めします。これにより、展開が少し複雑になります。ただし、実行可能な「ファイアウォール」を提供し、同じ名前のグローバル オブジェクトが衝突することなく各バイナリに存在できるようにします。それでも、アプリと DLL の両方に競合するサードパーティの依存関係がある場合、問題が発生する可能性があります。それでも、おそらく最良の選択肢です。

于 2013-04-30T23:03:42.100 に答える