一.靜態庫和動態庫的定義及區別
程式編譯的四個過程:
1.預處理 展開標頭檔案/巨集替換/去掉注釋/條件編譯(.i字尾)靜態庫:2.編譯 檢查語法,生成彙編(.s字尾)
3.彙編 彙編**轉換成機器**(.o字尾)
4.鏈結 鏈結到一起生成可執行程式(.out字尾)
靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行動態庫:
動態庫是在程式執行時被鏈結的,程式執行完,庫仍需保留在系統上,以供程式執行時呼叫區別:
鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執行程式中,這樣系統空間有很大的浪費,而且一旦發現庫檔案中存在bug,就必須把鏈結該靜態庫的所有程式都找出來,然後重新編譯,十分的麻煩,而動態庫剛好彌補了這個缺陷,因為動態庫是在程式執行時被鏈結的,所以磁碟上只需保留乙份副本,節約了空間,如果動態庫中發現bug或者需要公升級,只要用新的庫把原來的替換掉就可以了,當然,由於動態庫是在程式執行時被鏈結,因此動態庫的執行速度比較慢
1.使用gcc生成靜態庫及靜態庫使用方法:
test.h
test.c
main.c
在此例中,test.c用於編譯生成靜態庫libtest.a,test.h為libtest.a對應的標頭檔案。第一步:生成test.o目標檔案,使用gcc -c test.c -o test.o命令。
第二步:使用ar將test.o打包成libtest.a靜態庫,使用ar rcs -o libtest.a test.o命令
第三步:生成libtest.a靜態庫後,可以使用命令ar t libtest.a檢視libtest.a檔案中包含哪些檔案。
2.使用gcc生成動態庫及使用動態庫的方法
第一步:生成test.o目標檔案,使用如下命令。在此處需要新增-fpic引數,該引數用於生成位置無關**已工生成動態庫使用,使用命令:gcc -c -o test.o -fpic test.c第二步:使用-shared引數生成動態庫,使用如下命令:gcc -shared -o libmyshare.so test.o,上述兩個命令可以連在一起,如下所示:gcc -shared -fpic -o libmyshare.so test.c
如何使用GCC生成動態庫和靜態庫
根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時候被鏈結的。程式執行完,庫仍需保留在系統上,以供程式執行時呼叫。鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執...
如何使用GCC生成動態庫和靜態庫
根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時候被鏈結的。程式執行完,庫仍需保留在系統上,以供程式執行時呼叫。鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執...
如何使用GCC生成動態庫和靜態庫
根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時候被鏈結的。程式執行完,庫仍需保留在系統上,以供程式執行時呼叫。鏈結靜態庫從某種意義上來說是一種複製貼上,被鏈結後庫就直接嵌入可執...