靜態庫 動態庫 實現與區別

2021-10-02 20:25:16 字數 715 閱讀 9862

程式在編譯鏈結的時候把庫的**鏈結到可執行檔案中。程式執行的時候將不再需要靜態庫, windows下(.lib)

程式在執行的時候才去鏈結動態庫的**,多個程式共享使用庫的**。乙個與動態庫鏈結的可執行檔案僅僅包含它用到的函式入口位址的乙個表,而不是外部函式所在目標檔案的整個機器碼, windows下(.dll)

生成:-shared:產生動態庫必需的命令引數

-fpic:產生位置無關的**

例:gcc -shared -fpic test.c -o libtest.so

使用:-l:路徑,指的是需要鏈結的動態庫的位置

-l:動態庫的名字,需要鏈結的動態庫是哪乙個

ld_library_path:搜尋動態庫的環境變數

例:gcc main.c -o main -l[path] -l test

找到動態庫的方法:

將動態庫放到當前可執行程式的目錄下

在環境變數當中設定動態庫的搜尋路徑,設定環境變數ld_library_path

(不推薦)直接將自己寫的庫或第三方庫檔案和作業系統庫檔案放到一起

在可執行檔案開始執行以前,外部函式的機器碼由作業系統從磁碟上的該動態庫中複製到記憶體中,這個過程稱為動態鏈結(dynamic linking)

動態庫可以在多個程式間共享,所以動態鏈結使得可執行檔案更小,節省了磁碟空間。作業系統採用虛擬記憶體機制允許物理記憶體中的乙份動態庫被要用到該庫的所有程序共用,節省了記憶體和磁碟空間

靜態庫與動態庫實現

本質上來說,庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。某些 需要給別人使用,但是我們不希望別人看到原始碼,就需要以庫的形式進行封裝,只暴露出頭檔案 對於某些不會進行大的改動的 我們想減少編譯的時間,就可以把它打包成庫。靜態庫即靜態鏈結庫 windows 下的 lib,linux ...

動態庫與靜態庫的區別

dll是在你的程式執行的時候才連線的檔案,因此它是一種比較小的可執行檔案格式,dll還有其他的檔案格式如.ocx等,所有的.dll檔案都是可執行。lib是在你的程式編譯連線的時候就連線的檔案,因此你必須告知編譯器連線的lib檔案在那裡。一般來說,與動態連線檔案相對比,lib檔案也被稱為是靜態連線庫。...

動態庫與靜態庫的區別

靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知編譯器lib檔案裡面的具體內容 2 設定lib檔案允許編譯器去查詢已經編譯好的二進位制 二,動態庫的...