アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下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

A 回答 (2件)

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等にも置いてみましたが変化はありませんでした。

補足日時:2007/04/05 18:45
    • good
    • 0

「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 を見てください。
    • good
    • 0
この回答へのお礼

ありがとうございます、原因が分かりました。

libtest.soまでは呼べていたのですが、libtest.soがさらに必要とするdllがありませんでした。とりあえず応急処置として必要なファイルをコピーすることで動きました。今後、コンパイル時のオプションを変更し、抜本的な対策をしたいと思います。使用しているコンパイラの特性をよく理解していないことが本質的な問題でした。

dlerror()の使い方とstrace、大変参考になりました。改めて御礼申し上げます。

お礼日時:2007/04/06 09:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!