• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:dlopenで目的の*.soファイルをロードできません)

dlopenで*.soファイルをロードできません

このQ&Aのポイント
  • Red Hat Linux EL4.0WSで、dlopenを使用してlibtest.soをロードできません
  • libtest.soをロードすることができず、printTest関数が見つからないエラーが発生します
  • pgCCでlibtest.cppをコンパイルしてlibtest.soを生成し、ldlでtest.cppを実行するとエラーが発生しました

質問者が選んだベストアンサー

  • ベストアンサー
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.1

dlerror() の使い方を間違えていませんか? library = dlopen("libtest.so",RTLD_LAZY); if(library==NULL){ printf("Could not open libtest.so?n"); printf("dlerror: %s?n", dlerror() ); exit(1); とかするとなんと言ってくるでしょう?

onosendai
質問者

補足

お返事ありがとうございます。ご指摘の通り、dlerror()の使い方が不適切でした。そこで教えて頂いたようソースを修正し、再度実行したところ、以下のようなメッセージが返ってきました。 dlerror: libtest.so: cannot open shared object file: No such file or directory どうしてもlibtest.soを見つけてくれないようです。ちなみにlibtest.soを/libや/usr/lib等にも置いてみましたが変化はありませんでした。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

「dlerror: libtest.so: cannot open shared object file: No such file or directory どうしてもlibtest.soを見つけてくれないようです。ちなみにlibtest.soを/libや/usr/lib等にも置いてみましたが変化はありませんでした。」 ならば strace を使ってみましょう。 $ strace a.out とすると、全てのシステムコールがどのように呼ばれているかが分かります。これで dlopen の中でどのパスを探しているか分かると思います。 あるいは絶対パスで .so ファイルを指定してみてはいかがでしょう? どうしても相対パスにしたければ man ldconfig を見てください。

onosendai
質問者

お礼

ありがとうございます、原因が分かりました。 libtest.soまでは呼べていたのですが、libtest.soがさらに必要とするdllがありませんでした。とりあえず応急処置として必要なファイルをコピーすることで動きました。今後、コンパイル時のオプションを変更し、抜本的な対策をしたいと思います。使用しているコンパイラの特性をよく理解していないことが本質的な問題でした。 dlerror()の使い方とstrace、大変参考になりました。改めて御礼申し上げます。

すると、全ての回答が全文表示されます。

関連するQ&A