2017-09-14 5 views
4

指定された名前を表示しません共有オブジェクトライブラリの構築:LDDは、私はDebianの上で共有オブジェクトライブラリを構築しようとしている

cat /etc/issue 
Debian GNU/Linux 9 \n \l 

私は(wrap.cを作成するためのラッパーとして機能し、通常のように、ライブラリとオブジェクトを構築すべてのオブジェクトファイル)

gcc -c -fPIC -W -Wall -O2 -funroll-loops wrap.c 
gcc -shared -Wl,-soname,libtest.so -o libtest.so *.o 
mv libtest.so /usr/local/lib/ && mv test-header.h /usr/local/include/ 

私は、ライブラリに引っ張ると、次のように正常にコンパイルするtest.cを作成します。

gcc test.c -ltest

ただし、次のエラーを返し./a.outプログラム実行中:

./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

.soを点検し、私は以下を参照してください

$ ldd /path/to/libtest.so 
    linux-vdso.so.1 (0x00007ffdb71c5000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1c22fba000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f1c23560000) 

私も、少なくとも言うだろうlibtest.so => noneを、表示されません私はライブラリを見つけることができません。

ここで何が起こっているのか分かりません。

同じプロセス(gcc -dynamiclib -o libtest.dylib *.o)でをmacOSに作成すると、実行可能ファイルでライブラリを正常に呼び出すことができます。私はDebianで何が違うのか分かりません。

答えて

2

/usr/local/libは1件のリンカのデフォルトの検索パス あるので、あなたが/usr/local/libで を配置している共有ライブラリlibtest.soは コマンド

gcc test.c -ltest 

にリンカが配置されます。あなたが./a.outを実行しようとすると、いずれかの場合には、ランタイム ローダは、変数LD_LIBRARY_PATHの値に列挙されているもの より直接他のディレクトリを検索しません。しかし、それはランタイムローダー によってそこに配置されていないます

現在の環境では です。デフォルトでは、ldconfig キャッシュに登録されているライブラリ を検索し、そのキャッシュは、新しく登場したライブラリ を登録するように更新され、ldconfig(root)としてのみ実行されます。その後

sudo ldconfig 

あなた:実行し、あなたの現在のシェルで成功するための

:持続的な成功のための

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib; ./a.out 

を、実行 - :

だからあなたのプログラムを実行するために、次の2つのオプションを持っていますプログラムは任意のシェルで実行されます。

には 共有ライブラリの依存関係はlibtest.soであることがわかります。それは で、./a.outの実行に失敗した理由が であり、それ自体が/path/to/libtest.soであることがわかります。共有ライブラリの依存関係を確認するには のa.outを実行してくださいldd a.out

+1

[-Wl、-rpath、/ usr/local/lib' –

+0

@Mikke Kinghan Doh ....!私は実行可能ファイルではなく、ライブラリ上でlddを使用していると完全に脳を怒らせました。何らかの理由で、それが私を完全に捨てました。洞察力を賞賛してください! – floopy

関連する問題