次の点を考慮してください。
- 私は静的ライブラリ 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 で再現できるかどうかはわかりません。