web-dev-qa-db-ja.com

共有ライブラリの未定義シンボルを使用するLinux共有ライブラリ

2つの共有ライブラリliba.soとlibb.so。 liba.soはlibb.soを使用します。すべてのcファイルは-fPICでコンパイルされます。リンクは-sharedを使用します。 liba.soでdlopenを呼び出すと、libb.soでシンボルが見つかりません...「undefinedsymbol」エラーが発生します。エラーなしでlibb.soをdlopenできます。ファイルが見つからないというエラーが発生しないため、libaがlibbを検出していることがわかります。 libb.soを削除すると、ファイルが見つかりませんというエラーが発生します。 -lutilを試しましたが、運がありませんでした。

何か案は????

そうそう。 gcc 4.1.2

更新:libaをリンクするときにrpathを使用して、libbを見つけられるようにします。

ldd liba.soは以下を返します:

linux-gate.so.1 => (0xffffe000)  
libb.so => ./libb.so (0xf6ef9000)  <-------- LIBB 
libutil.so.1 => /lib/libutil.so.1 (0xf6ef5000)  
libdl.so.2 => /lib/libdl.so.2 (0xf6ef1000)  
libm.so.6 => /lib/libm.so.6 (0xf6ec9000)  
libpthread.so.0 => /lib/libpthread.so.0 (0xf6eb1000)  
librt.so.1 => /lib/librt.so.1 (0xf6ea8000)  
libc.so.6 => /lib/libc.so.6 (0xf6d62000)  
/lib/ld-linux.so.2 (0x007d0000)   

libbの最後に。#がないことは重要ですか?

15
johnnycrash

すべてのオブジェクトとライブラリをリンクして実行可能ファイルを生成するときは、ライブラリの順序(すべての-lxxx引数)が(少なくともgccでは)重要であることを忘れないでください。

短い例:

LIBS = -L。 -ltest1 -ltest2

OBJS = code1.o code2.o

gcc $(LIBS)$(OBJS)-o mysoft

場合によっては失敗する可能性がありますが、

gcc $(OBJS)-o mysoft $(LIBS)

しません

1
Vincent Fenet