遮蔽動態庫之間的依賴

2021-08-18 15:04:44 字數 2146 閱讀 4141

假定a程式用到了動態庫b, b又用到了動態庫c, 那麼在編譯a的時候,需要在鏈結符號連指定c嗎?

如果能不指定的話,是最好的。

$ cat hello.c 

extern void foo(void);

void hello(void)

$ cat foo.c 

void foo(void)

$ cat test.c 

extern void hello(void);

int main(void)

$ gcc -fpic -shared -g foo.c  -o libfoo.so

gcc -fpic -shared hello.c -g -o libhello.so

$ gcc test.c -g -o test -l. -lhello -lfoo

$ gcc test.c -g -o test -l. -lhello

./libhello.so: undefined reference to `foo'

collect2: error: ld returned 1 exit status

從上面來看,不指定的話,會導致編譯錯誤。

嘗試在編譯 hello的時候指定 foo:

$ gcc -fpic -shared hello.c -g -o libhello.so -lfoo -l.
$ gcc test.c  -g -o test -l.  -lhello

/usr/bin/ld: warning: libfoo.so, needed by ./libhello.so, not found (try using -rpath or -rpath-link)

./libhello.so: undefined reference to `foo'

collect2: error: ld returned 1 exit status

$ ldd libhello.so 

linux-gate.so.1 => (0xb76dc000)

libfoo.so => not found

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fa000)

/lib/ld-linux.so.2 (0xb76dd000)

首選,使用 rpath來解決:

$ gcc -fpic -shared hello.c -g -o libhello.so libfoo.so -wl,-rpath=.
$ gcc test.c  -g -o test  -lhello -l.
$ ldd libhello.so 

linux-gate.so.1 => (0xb76ed000)

libfoo.so => ./libfoo.so (0xb76e3000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7508000)

/lib/ld-linux.so.2 (0xb76ee000)

鏈結問題沒有了

如果不想加 -wl,-rpath選項,可以把 libfoo.so放到 標準搜尋路徑下面:

$ gcc -fpic -shared hello.c -g -o libhello.so -l. -lfoo

$ sudo cp libfoo.so /lib/

$ gcc test.c -g -o test -lhello -l.

$ ldd libhello.so

linux-gate.so.1 => (0xb7732000)

libfoo.so => /lib/libfoo.so (0xb7703000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754d000)

/lib/ld-linux.so.2 (0xb7733000)

動態庫的依賴關係

dll動態庫是非常常用的技術手段,經常會發生巢狀的情況,一不小心系統就提示你缺少某個dll,從而某個函式不能用。今天做了個小測試,記錄如下。1 動態庫a產生後的檔案 a.h a.dll a.lib 2 動態庫b呼叫a的方法,所需a的檔案a.h a.dll a.lib,同時生成b.h b.dll b....

多動態庫依賴

0.介紹 0.1 靜態庫 靜態庫是一些目標檔案的集合,通常為字尾為.o 的檔案,通過ar 工具打包而成,命名 格式為lib a 其中 為給定的靜態庫檔名。在建立可執行程式的過程中,靜態庫同時被鏈結到程式 被主程式呼叫的函式目標檔案連 同主程式組合成單一的可執行程式。靜態庫只在程式鏈結時起作用,最終的...

Linux 檢視動態庫依賴

檢視動態庫依賴3種方法 1 ldd bin grep linux gate.so.1 0xffffe000 libc.so.6 lib libc.so.6 0xb7eca000 lib ld linux.so.2 0xb801e000 2 ld trace loaded objects 1 bin ...