web-dev-qa-db-ja.com

共有オブジェクトファイルを開けません

ここにあるUSB-I2C/SPI/GPIOインターフェイスアダプターのプロジェクトの1つをコンパイルしようとしています。

i2c_bridge-0.0.1-rc2.tgzパッケージをダウンロードしました。 libusbをインストールしましたが、問題なく動作するようです。 i2c_bridge-0.0.1-rc2/ディレクトリに移動して作成します。コンパイルされます。 i2c_bridge-0.0.1-rc2/i2cフォルダに移動して作成します。コンパイルして./i2cをくれます。しかし、実行するとerror while loading shared libraries: libi2cbrdg.so: cannot open shared object file: No such file or directoryと表示されます

i2c_bridge-0.0.1-rc2/i2cのメイクファイルには、ライブラリディレクトリが../として含まれています。 libi2cbrdg.soはこのディレクトリ(i2c_bridge-0.0.1-rc2)にあります。また、ファイルを/usr/local/libにコピーしました。 i2c_bridge-0.0.1-rc2/ディレクトリのls

i2c        i2cbrdg.d  i2cbrdg.o  libi2cbrdg.a   Makefile  tests
i2cbrdg.c  i2cbrdg.h  INSTALL    libi2cbrdg.so  README    u2c4all.sh

(そのi2cはディレクトリです)

私がSudo ./i2cの場合でも、問題は解決しません。

すべてのmakefileで-Werrorおよび-noWdecrepated(スペル?)オプションを削除してコンパイルする必要がありましたが、これで問題が発生することはありませんか?

.soファイルを見つけるには、他に何が必要ですか?誰かが私が何が悪いのかを見つけるのを手伝ってくれるなら、私はとても感謝しています。さらに情報が必要な場合は投稿できます。

16
Sterling

検索結果はコンパイル時と実行時で区別する必要があります。コンパイル時に指定する-Lフラグは、実行時のライブラリのローカライズとは関係ありません。これはむしろ、ライブラリに埋め込まれたいくつかの変数といくつかのパスを介して行われます。

この問題に対する最善のホットフィックスは、LD_LIBRARY_PATHを.soファイルのあるディレクトリに設定することです。例:

 $ LD_LIBRARY_PATH=.. ./i2c

長期的な解決策として、LD rpathとrunpathを備えたシステム全体をよく見るか、libtoolを使用する必要があります(これにより、これらの問題が移植可能に解決されます)。

/ usr/local/libへのファイルのコピーでは、ldが使用可能なライブラリをキャッシュするため、不十分なことがよくあります。したがって、ライブラリを/ usr/local/libにコピーした後、(rootとして)ldconfigを再実行する必要があります。

39
thiton

ライブラリを必要とするソースからコードをビルドする場合は、ライブラリのパスを環境変数 LD_RUN_PATH に入れてからビルドすると、リンカーがそのパスをバイナリに保存します。実行時に適切な場所で自動的に検索されるようにします。

Linux固有:代わりに、ライブラリを/lib/usr/lib、または/etc/ld.so.confまたはそのインポートされた構成フラグメントで参照されるその他のパスに配置すると、実行する必要があるのは/sbin/ldconfigは、ld.so(動的リンカー)のライブラリのキャッシュを更新します。

25
rakslice

これは私の問題でうまくいきます。

gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg

そして-Wl,-rpathオプションが重要なトリックです。

2
terwxqian