
以下C++のテストソース2ファイルをコンパイルし実行したのですが、libtest.soをロードすることが出来ません。OSはRed Hat Linux EL4.0WS、カーネルは2.6.9-5です。原因と思しき点がお分かりの方がいれば、教えて頂けますでしょうか。
********** ソースファイル1(libtest.cpp) **********
#include <stdio.h>
#include <stdlib.h>
extern "C" {void printTest();}
void printTest(){
printf(" *** SUCCESS!! *** Java - Native Interface test at INOAC\n");
}
********** ソースファイル2(test.cpp) **********
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
static void (*testFunc)();
int main(){
void *library;
const char * error;
library = dlopen("libtest.so",RTLD_LAZY);
if(library==NULL){
printf("Could not open libtest.so\n");
exit(1);
}
dlerror();
testFunc = (void (*)())dlsym(library,"printTest");
error = dlerror();
if(error){
printf("Could not find the function printTest\n");
exit(1);
}
printf("Test from C;\n");
(*testFunc)();
dlclose(library);
return 0;
}
********** 実行方法 **********
pgCC -fPIC -shared libtest.cpp -o libtest.so
pgCC -ldl test.cpp -o test.exe
setenv LD_LIBRARY_PATH "."
./test.exe
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);
とかするとなんと言ってくるでしょう?
この回答への補足
お返事ありがとうございます。ご指摘の通り、dlerror()の使い方が不適切でした。そこで教えて頂いたようソースを修正し、再度実行したところ、以下のようなメッセージが返ってきました。
dlerror: libtest.so: cannot open shared object file: No such file or directory
どうしてもlibtest.soを見つけてくれないようです。ちなみにlibtest.soを/libや/usr/lib等にも置いてみましたが変化はありませんでした。
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 を見てください。
ありがとうございます、原因が分かりました。
libtest.soまでは呼べていたのですが、libtest.soがさらに必要とするdllがありませんでした。とりあえず応急処置として必要なファイルをコピーすることで動きました。今後、コンパイル時のオプションを変更し、抜本的な対策をしたいと思います。使用しているコンパイラの特性をよく理解していないことが本質的な問題でした。
dlerror()の使い方とstrace、大変参考になりました。改めて御礼申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows10 フォルダ内の自動並...
-
mrl→midファイルへ
-
macのdmgファイル(動画)をMP4...
-
ODBCエラー「admin」によってロ...
-
.pkgというファイルについて。
-
ショートカットアイコンと、元...
-
拡張子TBの閲覧方法について
-
exeファイルを無効化するには
-
emlをtxtに変換するには?
-
XML ドキュメントファイルって...
-
onedriveの中身を削除したらパ...
-
BAKファイルを非表示にする方法
-
バッチファイルで変数の中身を...
-
ファイルの先頭行を全て削除したい
-
「日付時刻」と「撮影日時」は...
-
外字ファイル、eudc.tte と e...
-
「123 ファイル」を開く方法を...
-
ハードディスク容量が0GBと表示...
-
office365 ファイルを削除したい
-
MGRファイルは消して良いのか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Winmerge ファイルの中身は同じ...
-
Windows10 フォルダ内の自動並...
-
onedriveの中身を削除したらパ...
-
ファイルの先頭行を全て削除したい
-
教えてください!困ってます。
-
外字ファイル、eudc.tte と e...
-
コマンドプロンプトによるフォ...
-
mrl→midファイルへ
-
emlをtxtに変換するには?
-
office365 ファイルを削除したい
-
バッチファイルで変数の中身を...
-
outlookuの添付ファイルが開け...
-
ショートカットアイコンと、元...
-
VScodeでjarファイルを開く方法
-
同期センターのマークが出てま...
-
Excelで保存時間とPCの時間があ...
-
teratrermを使ったデータの送信...
-
ファイルの「読み取り専用」が ...
-
macのdmgファイル(動画)をMP4...
-
mac ファイルの詳細情報を編集...
おすすめ情報