0

Linux で共有ライブラリ (.so) を作成しましたが、非常に奇妙な問題に直面しています。最初に、ライブラリに 3 つの関数 (write_myown、setfolder、register) を追加し、さらにいくつか (init、write_re) を追加しました。

基本的にライブラリ全体は C++ で実装されていますが、API は C および C++ ベースの実行可能ファイルの両方から呼び出す必要があります。したがって、私は API に extern "C" を使用しました。

私が直面している奇妙な問題は、関数 write_myown、setfolder、および登録を使用しようとすると、リンクが通過し、実行可能ファイルが作成されることです。

しかし、関数 init または write_re を呼び出そうとすると、リンクが失敗し、未定義の参照エラーが発生します。

私が考えているが確信が持てないさらに奇妙なことは、Cのみのプログラムを構築している場合は正常に動作すると思いますが、C++ベースのコードを構築している場合、この問題が見られます。

私はすでに以下のことを確認し、確認しました

  1. ライブラリ(.so)は /usr/lib に存在します(そこに置きました)
  2. ldconfig -p | grep mylibname は、私のライブラリが存在することを示しています。
  3. init または write_re を呼び出さないと、実行可能ファイルが生成され、objdump/readelf に適切な参照が表示されます。
  4. mylibrary.so の ldd は、init と write_re の両方が存在することを示しており、可視性はグローバルです。
  5. 作成された実行可能ファイルまたは .0 は、mylibrary への適切な依存関係を示しています。
  6. mylibrary のバージョンはありません。
  7. 正しい.soを参照していることを確認しました。
  8. 私のライブラリの nm は、すべての関数が存在することを示しています。

どうすればこれを解決できますか?そして、何が問題になる可能性があります。そうでない場合は、どうすれば調査を進めることができますか。さらに詳細が必要な場合はお知らせください。

よろしく、 パヴァン

4

1 に答える 1

0

私が直面している奇妙な問題は、関数 write_myown、setfolder、および登録を使用しようとすると、リンクが通過し、実行可能ファイルが作成されることです。

しかし、関数 init または write_re を呼び出そうとすると、リンクが失敗し、未定義の参照エラーが発生します。

write_myownのクリスタル ボールはこう言いsetfolderます。.hextern "C"

しかし、後で を追加したときに、それらの定義をファイルにwrite_re入れましたが、 のプロトタイプに追加することを怠っていました。extern "C".cc.h

もしそうなら、

  • 関数は、ライブラリでマングルされていない形式で定義されています。
  • 純粋なC実行可能ファイルはそれらをうまく使用できます。
  • それらを (ライブラリの外で)参照するC++オブジェクトはそれらを認識しないextern "C"ため、マングルされた形式が必要です (もちろん、ライブラリでは提供されません)。

この仮説は、現在あなたの質問にあるすべての事実に適合すると思います。検証するのは簡単です。リンカからのエラーメッセージundefined symbol: write_reundefined symbol: write_re(some, parameter, types)

後者の場合、それは一部のオブジェクトがマングルされた名前を参照しているという完全なプレゼントです。

于 2013-02-08T04:19:32.373 に答える