假定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 ...