以下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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Winmerge ファイルの中身は同じ...
-
同期センターのマークが出てま...
-
onedriveの中身を削除したらパ...
-
コマンドプロンプトによるフォ...
-
ファイルの先頭行を全て削除したい
-
emlをtxtに変換するには?
-
バッチファイルで変数の中身を...
-
Windows10 フォルダ内の自動並...
-
教えてください!困ってます。
-
office365 ファイルを削除したい
-
ファイルの単位
-
外字ファイル、eudc.tte と e...
-
NAS上のExcelファイルを開く時...
-
teratrermを使ったデータの送信...
-
たくさんのフォルダを一つのフ...
-
Windows11 でのファイル削除
-
ファイル操作(削除など…)の履...
-
xcopy コマンドの EXCLUDE オプ...
-
mac 表示できなくなりました。
-
Kshでエラー(no closing quote...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Winmerge ファイルの中身は同じ...
-
onedriveの中身を削除したらパ...
-
同期センターのマークが出てま...
-
バッチファイルで変数の中身を...
-
ファイルの先頭行を全て削除したい
-
Windows10 フォルダ内の自動並...
-
教えてください!困ってます。
-
コマンドプロンプトによるフォ...
-
emlをtxtに変換するには?
-
ファイルの単位
-
mac ファイルの詳細情報を編集...
-
office365 ファイルを削除したい
-
Excellにて→ファイルエラー:デ...
-
macのdmgファイル(動画)をMP4...
-
クラリスワークスのファイルを...
-
mrl→midファイルへ
-
Windows11 ゴミ箱 ファイルの取...
-
会社のTeamsのことで相談です。...
-
フォルダ内の一覧を印刷するには?
-
exFATに欠点はありますか?
おすすめ情報