靜態庫和動態庫

2021-09-23 23:52:08 字數 1415 閱讀 7014

在lunux環境下。

*.c:原始檔案,這樣的檔案是我們直接編寫修改的檔案,包含了原始**。通常包含標頭檔案部分、巨集定義、函式宣告和定義等。

*.i:gcc -e。經過預處理器處理後得到的c檔案。處理過程是:將標頭檔案展開,替換巨集和去掉注釋。

*.s:gcc -s。經過編譯器處理後得到的彙編檔案。作用是將c程式**轉換為匯程式設計序。

*.o:gcc -c。經彙編器處理後得到的二進位制檔案。

a.out: gcc。經鏈結器將函式庫中相應**組合到目標檔案中。可以使用-o 指定輸出檔案的名字。

需要注意的是,要得到任何需要的中間檔案或最終執行檔案,不需要按步驟挨個執行,只需要直接執行對應的命令即可。

-c產生二進位制檔案

-i(大寫i)+目錄

指定頭檔案目錄

-o+檔名稱

指定執行檔名稱

-e生成預處理檔案

-g包含除錯資訊

在專案開放過程中,經常需要復用優秀**,或為他人提供**但不想被看到源**。那麼,這時我們需要構建函式庫,並將函式庫和標頭檔案一起發布。函式庫通常分為:靜態可和動態庫。

靜態庫,是在鏈結時打包到執行檔案中,直接發布可執行程式。其優點是定址方便,速度快;缺點是,**庫多次使用後,會導致冗餘,使**檔案變大。

靜態庫檔案命名規則:lib+庫的名字+.a

構建過程:

①將要打包的*.c檔案處理為二進位制檔案:

gcc -c +原始檔案  -l  +頭檔案目錄
②建立靜態庫:

ar rcs lib+庫的名字+.a *.o

nm 庫檔案 #檢視庫的內容

③使用靜態庫:

gcc -o 可執行檔名 原檔案 -l 靜態庫路徑 -l 靜態庫名 -i 頭檔案目錄

或gcc -o 可執行檔案 原檔案 -i 頭檔案目錄 lib***.a

動態庫,是在編譯時簡單引用,在執行時才載入記憶體,通過此方法,記憶體中可以只有乙份動態庫的副本而供很多應用程式使用,因此又叫做共享庫。優點是節省記憶體,易於更新(函式庫更新,不需要對整個檔案更新);缺點是延時繫結,速度慢。我麼可以使用ldd命令檢視程式所需要的動態庫。

動態庫檔案命名規則:lib+動態庫名字+.so

構建過程:

①生成與位置無關的.o檔案:

gcc -fpic -c *.c -i 頭檔案目錄
②建立動態庫:

gcc -shared -o lib+動態庫名稱.so *.o
③使用動態庫:

gcc -o 可執行檔名 原檔案 -l 動態庫目錄 -l 動態庫名稱 -i 頭檔案目錄

或gcc -o 可執行檔名 原檔案 -i 頭檔案目錄 lib***.so

庫(靜態庫和動態庫)

一 靜態庫 以c語言的形式生成庫 h中extern c int add int int extern c int sub int int 二.測試靜態庫 將.h和.lib放入 h ifdef cplusplus c 程式設計師用c的方式開啟 extern c int add int int exte...

靜態庫和動態庫

一。靜態庫 靜態庫的優點在於使用簡單,編譯快速。靜態庫在應用程式生成時,已經編譯成為可重定位的目標檔案,因此可以不必再編譯,節省編譯時間,以最短的時間生成可執行程式。步奏 a。建立靜態庫 1 在編輯器中編輯其靜態庫函式 static lib.c 2 在shell中編譯該原始檔,生成乙個可重定位的目標...

靜態庫和動態庫

靜態庫 lib 中相當於存放了所有的源 包括他引入的其他靜態lib檔案.其實是所有cpp編譯後對應的.obj檔案的打包 所以靜態lib都比較大。動態庫dll也有lib但是這個lib,只是用來幫助程式在鏈結時定位dll中的函式的位址的。所以會在exe載入時才重定位函式的位址。重定位就是根據鏈結的這個l...