首先要明白乙個概念,靜態庫和動態庫的目的是為了使二進位制**重用。
靜態庫:假設乙個場景,我們現在做了乙個專案a,如果我們希望專案a中的**能夠用於以後的專案b中,該怎麼辦呢?最簡單的想法就是將專案a的各個原始檔編譯生成的目標檔案和其他專案的目標檔案拼接起來,有兩種方法可以做到這一點
1、將專案a的目標檔案轉存至專案b的位置,然後進行鏈結
2、將專案a的目標檔案打包成乙個二進位制的檔案--靜態庫
可以看出,第二種方法更好,靜態庫可以更簡潔的為其他專案提供單個的二進位制檔案,而不是提供一組分離的目標檔案。注意,生成靜態庫的檔案的過程是可逆的,也就是說我們可以向乙個靜態庫中新增目標檔案,也可以將靜態庫檔案解壓成原來的一組二進位制檔案。
動態庫:再假設一種場景,在多工的系統中,無論有多少個並行的任務,特性的系統資源總是唯一的,比如鍵盤和網絡卡等,如果每乙個想訪問共享資源的應用程式都需要包含訪問資源的控制**,那麼控制**在記憶體中會出現多個副本,重複的**會使系統的效率變得低下。怎麼辦呢?---避免**冗餘。
正確的解決方案:1、在動態庫中提供通用的功能;
2、需要使用通用功能的應用程式只需要在執行時載入動態庫即可。
現在通用的解決方案是利用記憶體對映實現共享,即pic(位置無關**position independent code)技術。只需乙份載入到某一程序中記憶體對映的動態庫副本,就能對映到任何應用程式的程序中。
建立乙個靜態庫的步驟:
gcc -c first.c second.c
ar rcs libstaticlib.a first.o second.o
建立乙個動態庫的步驟:
通常來說,構建動態庫都需要以下兩個選項
-fpic 編譯器選項
-shared 鏈結器選項
gcc -fpic -c first.c second.c
gcc -shared first.o second.o -o libdynamiclib.so
注意: -fpic的pic是位置無關**,在pic出現以前,也能夠建立動態庫,裝載器將動態庫載入到程序記憶體空間中,但是只有第一次載入這個動態庫的程序能夠使用它。根本原因是,在將動態庫載入到程序中前,載入器需要修改動態庫的**段即.text段,使得動態庫對於該程序來說是有意義的,但是這種修改是不可逆的,所以一旦動態庫被修改再被其他的程序載入後,這個動態庫對於後面的程序就是不可用的,而出現pic後,採用記憶體對映的技術避免了將載入的動態庫**繫結到第乙個載入該動態庫的程序中。
參考書籍《高階c/c++編譯技術》
庫(靜態庫和動態庫)
一 靜態庫 以c語言的形式生成庫 h中extern c int add int int extern c int sub int int 二.測試靜態庫 將.h和.lib放入 h ifdef cplusplus c 程式設計師用c的方式開啟 extern c int add int int exte...
靜態庫和動態庫
一。靜態庫 靜態庫的優點在於使用簡單,編譯快速。靜態庫在應用程式生成時,已經編譯成為可重定位的目標檔案,因此可以不必再編譯,節省編譯時間,以最短的時間生成可執行程式。步奏 a。建立靜態庫 1 在編輯器中編輯其靜態庫函式 static lib.c 2 在shell中編譯該原始檔,生成乙個可重定位的目標...
靜態庫和動態庫
靜態庫 lib 中相當於存放了所有的源 包括他引入的其他靜態lib檔案.其實是所有cpp編譯後對應的.obj檔案的打包 所以靜態lib都比較大。動態庫dll也有lib但是這個lib,只是用來幫助程式在鏈結時定位dll中的函式的位址的。所以會在exe載入時才重定位函式的位址。重定位就是根據鏈結的這個l...