2011-12-16 7 views
2

共有オブジェクトを使用する単純なプログラムを作成し、それをdlopen()で開きます。私はまた、コンパイルされ、共有オブジェクト以下のようにリンク:私はそれがCで共有オブジェクトをリンクするにはどうしたらいいですか?

cannot open libmylib.so: no such file or directory 

のようなものは、私はインターネットを検索し、私が持っていることが判明した初めてのプログラムを実行しようとしたとき

gcc -o libmylib.so libmylib.c -shared -fPIC -Wall 

gcc -o program program.c -L. -lmylib -ldl -Wall 

プログラムを実行するために私の共有オブジェクトを/lib/i386-linux-gnu/にコピーしてください。だから私はそうした、それは働いたが、私は他の方法でそれをやろうとしたので、libmylib.so/lib/i3686-linux-gnu/ディレクトリから削除した。今私がプログラムを実行しようとしているときにエラーは表示されず、Segmentation faultと続きます。共有オブジェクトはどこにも見つかりませんが、何もコピーせずにリンクするにはどうすればよいですか?

私はあなたがプログラムをコンパイルするとき、あなたはそれを正しくリンクUbuntuの11.10

+0

ルートとして 'ldconfig'を実行すると、セグメンテーションフォールトは消えますか? – zwol

答えて

2

を使用しています。 -L. -lmylibを使用してください。しかし、それが標準のシステムライブラリでない場合、実行環境はどこを探すべきかを知る必要があります。 shared librariesについての詳細を読み、そのsearch paths、およびldコマンド

LD_LIBRARY_PATH=. ./program 

または

export LD_LIBRARY_PATH=. 
./program 
4

:あなたがこれを行うことができます一つの方法はそうのように、環境変数LD_LIBRARY_PATHを使用することです。

ライブラリの検索に使用される「ランタイム」パスを登録する方法もあります。あなたは、あなたのプログラムが実行時にいくつかの*.soファイルを-ing dlopenある場合は、あなたがより良いdlopen(または"./foo.so"のようなもの)への絶対ファイル名を渡しますgcc -Wl,-rpath . -o program program.c -L. -lmylib -ldl -Wall

を使用することができます。 realpathの機能が役立ちます。

実行パスを変更するために既存の実行可能ファイルで使用するコマンドは、chrpath(私が発見したばかりです)でもあります。

実行時パスまたは現在のディレクトリをLD_LIBRARY_PATHに置かないようにするセキュリティ上の理由(PATHと同様)があります。

関連する問題