注意我們這裡主要讨論在linux環境下的差別
我們大家都知道函數的庫分為兩種一個是靜态庫另一個是動态庫
庫檔案:
靜态庫 共享庫(動态庫)
半成品 零件半成品
Linux .a .so
Windows .lib .dll/.DLL
使用時機 連結過程 運作過程(将動态庫加載到磁盤中單獨執行)
連結過程 将庫裡的東西打包到了庫檔案,一旦生産靜态庫可以沒有
他們兩的主要差別是在使用的時機不同:
在動态庫隻是連結了位址一個符号, 靜态庫在連結是就進行了打包。
連結的過程再去尋找單獨去加載記憶體中。
.o也是二進制檔案的集合,相當于一個包是靜态中生成的編譯檔案,隻是檢視了文法什麼的錯誤是.c的中間檔案
動态庫是通過gcc生成不可單獨執行的可執行檔案,如果其它檔案調用可以單獨執行
靜态庫的優缺點:
優點:他編譯後執行不需要外部的函數庫支援,因為所有的函數都已經被編譯進去了。
缺點:如果庫函數改變,那就得重新編譯。
動态庫的優缺點:
優點:動态函數庫所産生的可執行檔案比較小,動态庫的改變不會影響到你的程式,是以在更新會比較友善。
缺點:因為庫函數沒有整合進你的程式,而是程式運作時動态的申請調用,是以程式的運作環境中必須提供相應的庫。
下來我們一起看看如何配置靜态庫與動态庫
生成靜态庫:
gcc -c *.c --> *.o
ar crv libxxx.a *.o-->libxxx.a
gcc -o main main.c -L(path) -lxxx xxx是名稱 path是路徑
取絕對路徑用=$(pwd)
生成動态庫:
gcc -shared -fPIC -o libxxx.so *.c 除了main.c
gcc -o main main.c -L. -lxxx
修改環境變量LD_LIBRARY_PATH: export LD_LIBRARY_PATH=最好是絕對路徑
2.将生成的動态庫拷貝到預設加載路徑下:
/lib /user/lib