靜態庫:
在程式編譯時會被鏈結到**中,程式執行時將不再需要靜態庫。
字尾是lib
靜態庫的生成:
生成靜態庫的時候要使用.o檔案來進行編譯生成
gcc
-cprint.c
-oprint.o
ar-rc
libtest.a
print.o
gccmain.c
-l.-ltest
-omain
動態庫:
在程式編譯並不會鏈結到**中,而是在程式執行時被載入,動態庫又被稱為動態鏈結庫,英文簡稱dll,dll是包含可以由多個程式使用的**和資料的庫,dll是不可執行檔案。
字首
lib
字尾
.
so
如何檢視乙個可執行檔案所依賴的庫?
ldd
+可執行程式
在linux作業系統下 靜態庫 linux字尾為.a檔案
動態庫 linux為.so檔案
libhello
.so
使用這個動態庫,我們直接在makefile檔案中-hello
就行.
ld_library_path是linux環境變數名,該環境變數主要用於指定查詢共享庫(動態鏈結庫)時除了預設路徑之外的其他路徑。並不是在編譯階段就起效果
ldd命令:
ldd是list, dynamic, dependencies的縮寫, 意思是, 列出動態庫依賴關係。
動態庫生成:
gcc/g
++-shared
:產生共享庫的命令列引數
-fpic:產生位置無關的**
我們來製作個動態庫
先寫個test.c
#include
intprint()
gcc
-shared
-fpic
test.c
-olibtest
.so
我們寫個測試的** main.c
#include
intmain()
此時檔案資訊
如何讓主函式使用這個libtest.so
gcc
main.c
-l.-ltest
-l指定鏈結的庫檔案路徑
-l鏈結的庫檔案路徑
(去掉了前字尾)
這樣就能找到這個動態庫進行鏈結
**問題:**不論將程式依賴的動態庫放到**程式都能找到自己依賴的動態庫
1:將動態庫放到可執行程式的目錄下
可執行程式會搜尋當前目錄
2:環境變數
ld_library_path
:儲存動態庫的搜尋路徑
我們來看這個路徑下有什麼
總結:echo: 顯示某個環境變數值
export: 設定乙個新的環境變數
env: 顯示所有環境變數
unset: 清除環境變數
set: 顯示本地定義的shell變數和環境變數
每個程式都會收到一張環境表,環境表是乙個字元指標陣列,每個指標指向乙個以』\0』結尾的環境字串
解耦:互相的影響不是很大
動態庫不止能動態鏈結,也可以在編譯程式的時候靜態鏈結,同理,靜態庫不僅僅能靜態鏈結,也可以在編譯程式的時候動態鏈結,生成乙個動態鏈結的可執行程式。
動態庫優點:
模組體積幾乎不變,當多個模組使用該庫時,記憶體中只存在乙份**。
缺點:**在單獨檔案中有零散檔案
靜態庫優點:
**合併到模組中,無零散檔案。
靜態庫缺點:
模組體積變大,多個模組使用庫,記憶體中存在多份**。
動態庫和靜態庫的區別
一 什麼是庫?庫是共享程式 的方式,一般分為靜態庫和動態庫。靜態庫 鏈結時完整地拷貝至可執行檔案中,被多次使用就有多份冗餘拷貝。動態庫 鏈結時不複製,程式執行時由系統動態載入到記憶體,供程式呼叫,系統只載入一次,多個程式共用,節省記憶體。二 靜態庫和動態庫的好處 使用靜態庫的好處 至於蘋果為啥禁止i...
linux動態庫和靜態庫的區別
兩者區別 a,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容 2 設定lib檔案允許編譯器去查詢已經編譯好的二進位制 b,動態庫的使用 程式執行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫 c,依賴性 靜態鏈結表示靜態性,在編譯鏈結之後,lib庫中需要的資源...
動態庫和靜態庫
本文主要解決以下幾個問題 1 為什麼要使用庫?2 庫的分類 3 建立自己的庫 或許大家對自己初學linux時的情形仍記憶尤新吧。如果沒有乙個能較好的解決依賴關係的包管理器,在linux下安裝軟體將是一件及其痛苦的工作。你裝a包時,可能會提示你要先裝b包,當你費盡心力找到b包時,可能又會提示你要先安裝...