特定の C++ ライブラリ (またはそれ以上のフレームワーク) に取り組んでいます。API の互換性だけでなく ABI も維持しながら、以前のバージョンとの下位互換性を持たせたいと考えています (Qt の素晴らしい仕事のように)。
私は Boost の多くの機能を使用していますが、ユーザーにまったく同じ (場合によっては古い) バージョンの Boost を強制的に使用させない限り、下位互換性が不可能になっているように思えます。
Boostのユーザーバージョンとの干渉を防ぐために、名前空間の周りに「プレフィックス」を作成/名前を変更する方法はありますか(Boostの1/2を書き換えずに)?
たとえば、私の libXYZ は Boost 1.33 を使用しており、 class がありboost::foo
ます。バージョン 1.35 ではバージョンboost::foo
アップと新しいメンバーの追加が行われたため、boost::foo
1.33 および 1.35 からは ABI に対応していません。そのため、libXYZ のユーザーは Boost 1.33 を使用するか、Boost 1.35 で libXYZ を再コンパイルする必要があります (XYZ がコンパイルしない方法で API が壊れている可能性があります)。
注:動的リンクが静的リンクに似ている ELF を使用する UNIX/Linux OS について話しているため、シンボルが干渉するため、2 つの異なるバージョンのライブラリとリンクすることはできません。
私が考える適切な解決策の 1 つは、Boost を他のプライベート名前空間に配置することです。そのため、libXYZ は::XYZ::boost::foo
の代わりに使用し::boost::foo
ます。これにより、ユーザーが使用する可能性のある他のバージョンの Boost との衝突を防ぐことができます。
そのため、libXYZ は引き続き Boost 1.33 で動作し、静的または動的に他の名前空間にリンクされます。
- Boost API を外部に公開しません。
- 公開された API の安定したプライベート バージョンを保持します。
Boostでそのようなことを行う方法はありますか?
編集:最後に、ソース内のすべてのブースト シンボルの名前をカスタム シンボルに変更するスクリプトを作成することにしました。
根拠: コンパイラの可視性のサポートとは無関係に、ビルド プロセスを簡素化します。また、可視性は動的ライブラリでのみ機能し、静的では機能しないため、ライブラリの種類ごとに個別のビルドと依存関係が必要です。
スクリプトはhttp://art-blog.no-ip.info/files/rename.pyで入手できます。
編集 2: Boost BCP の最新バージョンは名前空間の名前変更をサポートしています。