什麼是庫?
庫是編譯好的一些目標**的打包檔案。
動態庫與靜態庫的概念?
靜態庫在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中,對應的鏈結方式稱為靜態鏈結。試想一下,靜態庫與彙編生成的目標檔案(.o檔案)一起鏈結為可執行檔案,那麼靜態庫必定跟.o檔案格式相似。其實乙個靜態庫可以簡單看成是一組目標檔案(.o/.obj檔案)的歸檔集合,即很多目標檔案經過壓縮打包後形成的乙個檔案。
靜態庫特點總結:
1、靜態庫對函式庫的鏈結是放在編譯時期完成的。2、程式在執行時與函式庫再無瓜葛,移植方便。3、浪費空間和資源,因為所有相關的目標檔案與牽涉到的函式庫被鏈結合成乙個可執行檔案。4、對程式的更新、部署和發布頁會帶來麻煩。如果靜態庫libtest.a更新了,所有使用它的應用程式都需要重新編譯、發布給使用者。
動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入。不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項,規避了空間浪費問題。動態庫在程式執行是才被載入,也解決了靜態庫對程式的更新、部署和發布頁會帶來麻煩。使用者只需要更新動態庫即可,增量更新。
動態庫特點總結:
1、動態庫把對一些庫函式的鏈結載入推遲到程式執行的時期。2、可以實現程序之間的資源共享。(因此動態庫也稱為共享庫)3、將一些程式公升級變得簡單。4、甚至可以真正做到鏈結載入完全由程式設計師在程式**中控制(顯示呼叫)。
總體總結:
二者的不同點在於**被載入的時刻不同。靜態庫在程式編譯時會被連線到目標**中,程式執行時將不再需要該靜態庫,因此體積較大。動態庫在程式編譯時並不會被連線到目標**中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在,因此**體積較小。動態庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有乙份該共享庫的例項。帶來好處的同時,也會有問題!
linux下生成靜態庫、動態庫過程:
關於靜態庫:
字首lib,字尾.a
gcc -c a.c -o a.o
ar -cr libmytest.a b.o
關於動態庫:
字首lib,字尾.so
gcc -fpic -c a.c -o a.o
gcc --share b.o -o libmytest.so
gcc main.c -o main -l ./ -lmytest(指定在當前路徑下鏈結庫mytest(注意這是庫名),因為庫的預設搜尋路徑是/lib64或者/usr/lib64)
由於動態庫又稱為"執行時庫",因此執行時依賴庫的存在。
通過環境變數修改,執行時庫查詢路徑:
幾個命令:
nm:ldd:
靜態庫與動態庫
linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...
靜態庫與動態庫
庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...
靜態庫與動態庫
1.靜態庫 工程在呼叫靜態庫時,複製靜態庫,源 加長,不節省程式空間。字尾名.a 優點 程式設計後不需要再依賴庫 以空間換時間 建立靜態庫 gcc c 原始檔.c ar rcs rcu 靜態庫名 目標檔案1 目標檔案2 rc 靜態庫不存在,就建立該庫檔案 s 更新靜態庫 使用 gcc o file ...