天天看點

linux 可執行程式 動态庫 差別,靜态庫與動态庫的差別以及優缺點,在linux環境下配置靜态庫與動态庫...

注意我們這裡主要讨論在linux環境下的差別

我們大家都知道函數的庫分為兩種一個是靜态庫另一個是動态庫

庫檔案:

靜态庫                                             共享庫(動态庫)

半成品                                              零件半成品

Linux         .a                                                        .so

Windows   .lib                                                       .dll/.DLL

使用時機    連結過程                                             運作過程(将動态庫加載到磁盤中單獨執行)

連結過程    将庫裡的東西打包到了庫檔案,一旦生産靜态庫可以沒有

他們兩的主要差別是在使用的時機不同:

linux 可執行程式 動态庫 差別,靜态庫與動态庫的差別以及優缺點,在linux環境下配置靜态庫與動态庫...
linux 可執行程式 動态庫 差別,靜态庫與動态庫的差別以及優缺點,在linux環境下配置靜态庫與動态庫...

在動态庫隻是連結了位址一個符号,                                          靜态庫在連結是就進行了打包。

連結的過程再去尋找單獨去加載記憶體中。

.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