動態庫與靜態庫

2022-06-03 05:45:11 字數 945 閱讀 1037

**自:

什麼叫庫?

庫(library)說白了就是一段編譯好的二進位制**,加上標頭檔案就可以供別人使用。 

一種情況是某些**需要給別人使用,但是我們不希望別人看到原始碼,就需要以庫的形式進行封裝,只暴露出頭檔案。

另外一種情況是,對於某些不會進行大的改動的**,我們想減少編譯的時間,就可以把它打包成庫,因為庫是已經編譯好的二進位制了,編譯的時候只需要 link 一下,不會浪費編譯時間。

靜態庫:

靜態庫即靜態鏈結庫(windows 下的 .lib,linux 和 mac 下的 .a)。之所以叫做靜態,是因為靜態庫在編譯的時候會被直接拷貝乙份,複製到目標程式,這段**在目標程式裡就不會再改變了。 

靜態庫的好處很明顯,編譯完成之後,庫檔案實際上就沒有作用了。目標程式沒有外部依賴,直接就可以執行。當然其缺點也很明顯,就是會使用目標

程式的體積增大。

動態庫:

動態庫即動態鏈結庫(windows 下的 .dll,linux 下的 .so,mac 下的 .dylib)。與靜態庫相反,動態庫在編譯時並不會被拷貝到目標程式中,目標程序中只會儲存指向動態庫的引用。等到程式執行時,動態庫才會被真正載入進來。 

動態庫的優點是,不需要拷貝到目標程式中,不會影響目標程式的體積,而且同乙份庫可以被多個程式使用(因為這個原因,動態庫也被稱作共享

庫)。同時,編譯時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯**。動態庫帶來的問題主要是,動態載入會帶來一部分性

能損失,使用動態庫也會使得程式依賴於外部環境。如果環境缺少動態庫或者庫的版本不正確,就會導致程式無法執行(linux 下喜聞樂見的 lib not

found 錯誤)。 

靜態庫與動態庫

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 ...