2011-12-03 3 views
8

私が作成したライブラリを動的にリンクする必要があります。私はその問題が何であるか正確には分からない。それはすべて正常にコンパイルが、私はいつもNULLポインタとしてhandleをキャッチ:libdlと動的リンクライブラリを正しく使用する

void *handle; 
char *error; 
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY); 
//same error comes up with full path as well as './hw11...' 
if(!handle){ 
    error = dlerror(); 
    printf("%s\n", error); 
    printf("Error loading library.\n"); 
    exit(1); 
} 

私はこのエラーを渡されるカントと私はおそらく間違っている可能性が何か分かりません。私はすべてを正しくコンパイルしたと確信しています。ここで私が使用コンパイル手順は次のとおりです。私はET_DYNとET_EXECをロードすることができ

を読み込みエラーを取得しています

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4 

答えて

14

hw11-lib-michaelSchilling.soをビルドするときに、gccに共有オブジェクトを指定するようには表示されません(.soで十分ではありません)。 -cそれは、オブジェクトファイルを生成する'S(オブジェクトを共有していない)とmichaelSchilling.soそれを呼び出すことで

。リンカーは呼び出されません。

gccコマンドラインから-cを削除し、-sharedを追加します。

gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
+0

'-rdynamic'に沿って?両方で、 '-shared'で試してみましたが、同じエラーが出ました。 –

+0

@MichaelSchilling: '-rdynamic'は問題とは関係ないと思うので、あなたのコードで必要な場合に備えておくこともできます。 – NPE

+0

@MichaelSchilling: '-c'を削除しましたか? – NPE

0

ファイルシステムの絶対ルートにhw11-lib-michaelSchilling.soがありますか?あなたはそれがスラッシュを導くことであると主張している...しかし、私はそれがないと思う。

エラー処理では、印刷する内容にdlerror()の出力を含めて、エラーの原因を調べます。

+0

hw11が必要-lib-michaelSchilling.so:共有オブジェクトファイルを開くことができません:そのようなファイルやディレクトリはありません 私はエラーが発生しますが、実行しようとしているプログラムと同じディレクトリです。 スラッシュも削除しました。 –

+0

共有オブジェクトに完全な絶対パスを提供して、それが役立つかどうかを確認してください。 – mah

+0

私はしました、そして、私は 'ET_DYNとET_EXECだけが読み込めます。 ' –

1

パス名の最初の文字としてのスラッシュ(/)は、パス名が絶対パス(ルートディレクトリからの相対パス)であり、現行の作業ディレクトリに対してではなく、確かにバイナリの相対パスではないことを示します。バイナリの場所を把握することで完全なパスを指定する必要があります(それ自体は簡単な問題ではありません)、または$ORIGINdlopenとすることができるかもしれません(rpathで動作しますが、 dlopen)。

+0

パスの前の期間はどうですか? ( '。/') –

+0

これはプログラムバイナリの場所ではなく、現在の作業ディレクトリを基準にしています。 –

0
gcc -fPIC -shared -rdynamic library.c -o library.o 

Linux上で私のために働き、それを開くコードのためのライブラリ をコンパイルするとき、あなたは-ldl

関連する問題