1.靜態庫
1.靜態庫實際上就是一些目標檔案(一般以.o結尾)的集合,靜態庫一般以.a結尾,只用於生成可執行檔案階段。
2.在鏈結步驟中,鏈結器將從庫檔案取得所需**,複製到生成的可執行檔案中。這種庫稱為靜態庫。其特點是
可執行檔案中包含了庫**的乙份完整拷貝,在編譯過程中被引導程式中。缺點就是多次使用就會有多份拷貝,
並且對程式的更新、部署和發布會帶來麻煩,如果靜態庫有更新,那麼所有使用它的程式都需要重新編譯、發布。
命令:首先生成目標檔案 gcc -c test.c -o test.o
使用ar命令將目標檔案打包成靜態庫 ar rcs libtest.a test.o
檢視靜態庫內容 ar t libtest.a
鏈結靜態庫命令 gcc -o test test.c -l. -ltool 該命令直接將庫檔案鏈結到目標檔案中,生成可執行檔案test
-l表示指定了尋找庫檔案的路徑 .表示當前路徑 -l表示要鏈結的靜態庫 tool就是靜態庫的名字
ldd 可執行檔案 檢視可執行檔案 鏈結到了哪些庫。
2.動態庫
1.動態庫在鏈結階段沒有被複製到程式中,而是在程式執行時由系統動態載入到記憶體中供程式呼叫
2.系統只需載一次動態庫,不同的程式可以得到記憶體中相同動態庫的副本,因此節省了很多記憶體
命令:首先生成目標檔案 gcc -c test.c
使用-fpic和-shared生成動態庫 gcc -shared -fpic -o libtest.so test.o
鏈結動態庫命令 gcc -o test test.c -l. -ltool 跟鏈結靜態庫的命令一樣,如果當前庫中有兩種庫 優先載入 動態庫
ld_library_path=指定查詢共享庫
3.靜態庫與動態庫的區別
載入時刻不同:
1.靜態庫在程式編譯時會鏈結到目標**中,程式執行時不再需要靜態庫,因此體積較大。而且每次編譯都需要載入
靜態**,因此記憶體開銷大。
2.動態庫在程式編譯時不會被鏈結到**中,而是在程式執行時才被載入,程式執行時需要動態庫存在,因此體積小。
而且系統只需載入一次動態庫,不同程式可以得到記憶體中相同動態庫的副本,因此記憶體開銷小。
C 靜態庫與動態庫
感覺比較形象,就摘過來了.這次分享的 宗旨是 讓大家學會建立與使用靜態庫 動態庫,知道靜態庫與動態庫的區別,知道使用的時候如何選擇。這裡不深入介紹靜態庫 動態庫的底層格式,記憶體布局等,有興趣的同學,推薦一本書 程式設計師的自我修養 鏈結 裝載與庫 庫是寫好的現有的,成熟的,可以復用的 現實中每個程...
C 靜態庫與動態庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll 所謂靜態 動態是指鏈結。回顧一下,將乙個程...
c 靜態庫與動態庫
庫分為靜態庫,動態庫,在不同系統下字尾不同。2.1.1 在鏈結和執行階段都涉及庫的呼叫 訪問 h檔案 標頭檔案 是庫的介面。h檔案提供給庫的使用者,使用者通過.h來呼叫庫中的api。2.1.2 庫中包含的是函式的實現 一堆函式的實現 這些函式在編寫的時候同樣要包含1中的標頭檔案,然後生成庫。2.1....