2011-11-07 16 views
15

ここにあるプロジェクトの1つをコンパイルしようとしています USB-I2C/SPI/GPIOインタフェースアダプタ。共有オブジェクトファイルを開くことができません

i2c_bridge-0.0.1-rc2.tgzパッケージをダウンロードしました。私はlibusbをインストールしましたが、それは問題なしでうまくいくようでした。私はi2c_bridge-0.0.1-rc2/ディレクトリに入り、makeします。それがコンパイルされます。私は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

のメイクファイルは、../というライブラリディレクトリを持っています。 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がディレクトリであること)

I sudo ./i2cあれば、それはまだ私に問題を与えます。

すべてのメイクファイルで-Werror-noWdecrepated(スペル?)オプションを取り除かなければコンパイルできませんでしたが、これは影響しませんか?

ファイルには.soファイルを見つけるために何が必要ですか?誰かが私が間違っていることを見つけるのを助けることができれば、私はとても感謝しています。さらに情報が必要な場合は、私はそれを投稿することができます。

答えて

39

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

この問題に対する最善のホットフィックスは、多くの場合、例えば、.soのファイルとディレクトリにLD_LIBRARY_PATHを設定している:

$ LD_LIBRARY_PATH=.. ./i2c 

長期的な解決策のために、あなたはよく見を持っているいずれかの必要がありますrpathとrunpathを持つLDシステム全体、またはlibtoolを使用して(これらの問題を移植する)

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

+0

私のすべてのライブラリでLD_LIBRARY_PATHですか?だから私がそのコマンドを実行すれば、私はそれを元に戻すまで他のものを混乱させるだろうか?どのように設定されているのですか? – Sterling

+2

環境変数です。したがって、 "echo $ LD_LIBRARY_PATH"で確認できます。コマンドラインで設定されている方法は、i2cプロセスとそのサブプロセスに対してローカルです。 – thiton

+1

私の質問ではありませんが、これが私の正確な問題を解決する助けになりました – Rich

25

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

Linuxの特定を:代わりに、/lib/usr/lib、またはあなたの/etc/ld.so.confまたはそのインポート設定の断片で参照他のいくつかのパス、その後、あなたがする必要があるすべてはld.soをリフレッシュするために/sbin/ldconfigを実行している(ダイナミックリンカがライブラリを置きます)のライブラリのキャッシュ。

+0

'/ etc/ld.so.conf.d/libc.conf'に'/usr/local/lib'を持っていましたが、**ダイナミックリンクライブラリ'sudo ldconfig'を使ってキャッシュリフレッシュ**をしてくれました。 –

1

私の問題ではうまくいきます。誰も助けてくれることを願っています。

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

-Wl,-rpathオプションは重要なトリックです。

関連する問題