ここにある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
ファイルを見つけるには、他に何が必要ですか?誰かが私が何が悪いのかを見つけるのを手伝ってくれるなら、私はとても感謝しています。さらに情報が必要な場合は投稿できます。
検索結果はコンパイル時と実行時で区別する必要があります。コンパイル時に指定する-Lフラグは、実行時のライブラリのローカライズとは関係ありません。これはむしろ、ライブラリに埋め込まれたいくつかの変数といくつかのパスを介して行われます。
この問題に対する最善のホットフィックスは、LD_LIBRARY_PATHを.soファイルのあるディレクトリに設定することです。例:
$ LD_LIBRARY_PATH=.. ./i2c
長期的な解決策として、LD rpathとrunpathを備えたシステム全体をよく見るか、libtoolを使用する必要があります(これにより、これらの問題が移植可能に解決されます)。
/ usr/local/libへのファイルのコピーでは、ldが使用可能なライブラリをキャッシュするため、不十分なことがよくあります。したがって、ライブラリを/ usr/local/libにコピーした後、(rootとして)ldconfigを再実行する必要があります。
ライブラリを必要とするソースからコードをビルドする場合は、ライブラリのパスを環境変数 LD_RUN_PATH に入れてからビルドすると、リンカーがそのパスをバイナリに保存します。実行時に適切な場所で自動的に検索されるようにします。
Linux固有:代わりに、ライブラリを/lib
、/usr/lib
、または/etc/ld.so.conf
またはそのインポートされた構成フラグメントで参照されるその他のパスに配置すると、実行する必要があるのは/sbin/ldconfig
は、ld.so(動的リンカー)のライブラリのキャッシュを更新します。
これは私の問題でうまくいきます。
gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg
そして-Wl,-rpath
オプションが重要なトリックです。