0

いくつかの定義が でラップされた C++ ライブラリ コードがあるとしextern "C" { ... }ます。

その C++ ライブラリを使用する C ライブラリ コードもあります。

私がやりたいことは、単一の .so ファイルを作成することですdlopen。これにより、このライブラリの使用を開始するには を 1 回呼び出すだけで十分です。

これが私が今やっていることです:私は最初に私のC++ライブラリを.soファイルに.soファイルにコンパイルしています-shared -rdynamic -fPIC. 次に、C ライブラリを同じパラメータで .so ファイルにコンパイルしています。その後、dloadC ライブラリをロードする前に C++ ライブラリをロードする必要があります。そうしないと、ロードがundefined symbolエラーで失敗します。

私がやりたいことは、この 2 つのライブラリを 1 つの .so ファイルにコンパイルして、 を 1 回呼び出すだけdloadで十分に使用できるようにすることです。

どうやってやるの?

前もって感謝します。

編集: .o ファイルにコンパイルしてから結合してもうまくいきません。これが私がすることです:

  • -fPIC パラメータを使用して、各ファイルをオブジェクト ファイルにコンパイルします。
  • 私はそれらをリンクしますclang [list of object files] -shared -rdynamic -fPIC -o libmylib.so
  • ロードしようとすると、undefined symbol: __gxx_personality_v0エラーが発生します。

EDIT2:ああ、私はそれをリンクするのを忘れましたlibstdc++、それは今動作します。ありがとう。

4

1 に答える 1

1
  1. 最も簡単な方法は、.soすべてのオブジェクト ファイルを結合するか、2 つの静的.aライブラリを構築してからそれらを 1 つの共有ライブラリにリンクすることにより、それらを 1 つのファイルに結合することです。
  2. 本当に 2 つの.soファイルを保持したい場合は、実行可能ファイルの場合と同様に、最初のライブラリを 2 番目のライブラリにリンクします。たとえば、libfooに依存している場合は、libbarでコンパイルlibfoo-lbarます。LD_LIBRARY_PATHデフォルトのライブラリパスまたは環境変数に依存ライブラリが必要です。
于 2013-06-04T07:37:45.210 に答える