8

特定のクローズドソースC++APIを使用する必要があるアプリケーションがあります。このAPIは、Boostの一部、バイナリライブラリファイルなどとともに配布されます。私は自分のコードでBoostを使用するのが好きです。Boostのすべての部分が配布されていないため、Boostのバージョンを使用することはできません。どうすればいいですか?ターゲットプラットフォームはLinuxであり、最終的にはWindowsでもあります。

  • APIの境界を越えてBoostオブジェクトを渡しません。
  • コードがブーストヘッダーを使用、APIのコードがブーストヘッダーを使用するようにオブジェクトファイルにコンパイルできます。この部分は簡単に思えます。
  • 取得できないもの:コードをBoostライブラリファイルリンク する方法、およびAPIのコードをBoostライブラリファイルリンクする方法。APIの周りに独自のラッパー(ヘッダーにBoostが含まれていないラッパー)をダイナミックライブラリにコンパイルする必要がありますか?(これがリンクを作成するために考えられる唯一の方法です。APIのBoostライブラリファイルのシンボルは、Boostライブラリファイルのシンボルと同じである必要があります。2段階でリンクを実行する必要があります。唯一の方法です。プログラムの一部をリンクすることができますが、残りはダイナミックライブラリを作成することですよね?)
4

3 に答える 3

1

特定の実行可能ファイルは、シンボルごとに 1 つのコードしか持つことができません。したがって、彼らのライブラリがブースト v. 1 のシンボル foo を使用し、ブースト v. 2 の同じシンボルを使用すると、衝突が発生します。シンボルを変更せずにこの衝突を取り除く簡単な方法はありません。ブーストコードを動的ライブラリにコンパイルできれば、動的実行を使用できるはずですが、これはやり過ぎのようです。

C++ では、シンボルはそのクラス/名前空間でマングルされるため、これらのいずれかを変更してシンボルを変更することもできます。

于 2011-06-16T17:29:12.250 に答える
0

API は、彼らが使用したブースト ライブラリとどのようにリンクしていますか? 彼らはそれと一緒にboost-##.soを展開しますか、それとも静的リンクでしたか?

そのため、api .so で「objdump -T api.so | grep boost」を実行して、API が Boost を公開しているかどうかを確認してください。

また、ユーザー chrisaycock が言及したように、ブースト名前空間の名前を変更した可能性もあります。c++filt コマンドを使用して、「objdump -T api.so | grep boost」で見つけたシンボルを詳しく調べます。

静的にリンクされていて、ブースト シンボルが公開されていない (または名前が変更されている) 場合は、API のブーストに関係なく、コードでブーストを使用できます。

ブーストが本当に露出している場合は、ブーストを試してみることをお勧めします. ブーストを使用するコードでは、おそらく衝突は発生しません。その場合は、新しいブーストをコンパイルして名前空間名を変更できます。「namespace boost_1_46」などの「namespace boost」を置き換えるすべて置換スクリプトを実行するだけです。

于 2011-06-24T06:43:02.687 に答える
0

ヘッダーのみのブースト ライブラリのみを使用している場合は、他のライブラリにリンクするコードとは別にコードをビルドできます。

どのブースト ライブラリを使用していますか?

于 2011-02-02T01:07:46.520 に答える