靜態庫是在鏈接階段被鏈接的,所以生成的可執行文件就不受庫的影響,即使庫被刪除,程序依然可以成功運行。
而依賴動態庫的程序其實也有鏈接動態庫的階段,只不過這個鏈接並不是真正的將動態庫鏈接到程序中,其目的是告訴程序,所依賴的到底是哪個動態庫。
靜態庫有點類似於將靜態庫復制到程序中,而動態庫是在程序中創建一個軟連接。
比如:
//a.c 主程序源代碼 #include <stdio.h> #include "b.h" main(){ bb(); } //b.h 主程序依賴b庫,b庫的頭文件是b.h int a; void bb(void); //b.c b庫源代碼 #include <stdio.h> #include "b.h" int a=7; void bb(){ printf("das%d\n",a); }
首先生成動態庫:
第一步:生成b.o目標文件,使用如下命令。在此處需要添加-fPIC參數,該參數用於生成位置無關代碼已工生成動態庫使用,使用命令:gcc -c -o b.o -fPIC b.c
第二步:使用-shared參數生成動態庫,使用如下命令:gcc -shared -o libb.so b.o,
不過上述兩部可以連在一起,:gcc -shared -fPIC -o libb.so b.c

接下來就是將程序文件a.c鏈接動態庫生成二進制可執行程序的過程了,這里有很多方法:
方法一:如果將libb.so移動到/lib64;/usr/lib64;這兩個任意目錄下,直接用命令gcc -o a a.c -lb,則鏈接成功,

但是不提倡用這個方法,因為是我們自己編寫的庫文件,/lib;/usr/lib64這兩個文件夾下都是些系統的庫文件,所以還是不要碰這兩個文件夾了
方法二:我們先在本地目錄下生成動態庫文件,然后將本目錄加入到系統搜索動態庫文件的環境變量LD_LIBRARY_PATH中(export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH)(事實上動態庫的環境變量不只這一個,還有LD_PRELOAD,詳見其他博客),然后再執行gcc -o a a.c -L. -lb

方法三,指定動態文件的位置,比如gcc -o a a.c /root/libb.so;gcc -o a a.c ./libb.so
一旦指定了動態文件的位置,動態文件將不能移動。以下通過gcc -o a a.c ./libb.so舉例(我本人推薦此方法):
gcc -o a a.c ./libb.so

在方法三中,鏈接時已經明確了動態庫的位置,所以如果移動動態庫,甚至將動態庫移動至/lib64目錄下,或者將主程序a移動至其他目錄,都將導致程序運行失敗,只要保證動態庫與可執行程序保持在同一文件夾下才有效
