導航:首頁 > 操作系統 > linux動態庫靜態編譯

linux動態庫靜態編譯

發布時間:2022-09-24 04:28:13

1. linux動態庫和靜態庫的區別

我們通常把一些公用函數製作成函數庫,供其它程序使用。
函數庫分為靜態庫和動態庫兩種。
靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。
具體的程序參見:
http://blog.chinaunix.net/u1/34474/showart_362189.html

2. linux怎麼靜態編譯

關於在 Linux 環境下面對 C 語言源程序進行靜態編譯,關鍵是要看你的 C 語言源程序中都使用到了哪些系統庫函數?如果是標準的輸入、輸出庫函數,只要在命令行提示符 $ 下面執行:
gcc my_prog.c 即可(預設的可執行文件名是:a.out);如果在用戶的源程序中使用到了數學計算函數,那麼在命令行提示符 $ 下面必須執行:
gcc my_prog.c -IMATH.LIB(假設涉及到各種數學計算的數學庫的庫文件為:MATH.LIB)
如果不加上 -IMATH.LIB 選項,那麼即使你的源程序編寫得再正確,也無法正常編譯。
另外還有一個必須要注意的就是:在 Linux 的環境變數中,一定要把 INCLUDE、LIB 所在的路徑設置好(在 SHELL 文件中寫好),這樣在使用 Linux 系統時才能夠減少出錯的機會。

3. linux 靜態庫和動態庫編譯的區別

Linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so libhello.a
為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如: libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

動態庫和靜態庫的區別:
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。

兩種庫的編譯產生方法:
第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫:

/* hello.c */
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc -c hello.c -o hello.o
1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar cqs libhello.a hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立兩個符號連接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc -shared 參數使其生成是動態庫而不是普通執行程序。
-Wl 表示後面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有 soname名字的文件,%B

4. linux靜態庫怎麼編譯

創建並使用靜態庫
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數,作為程序入口;test.c中包含main函數中需要用到的函數。
vi test.h test.c main.c
第二步:將test.c編譯成目標文件。
gcc -c test.c
如果test.c無誤,就會得到test.o這個目標文件。
第三步:由.o文件創建靜態庫。
ar rcs libtest.a test.o
第四步:在程序中使用靜態庫。
gcc -o main main.c -L. -ltest
因為是靜態編譯,生成的執行文件可以獨立於.a文件運行。
第五步:執行。
./main
示例四 創建並使用動態庫
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數,作為程序入口;test.c中包含main函數中需要用到的函數。
vi test.h test.c main.c
第二步:將test.c編譯成目標文件。
gcc -c test.c
前面兩步與創建靜態庫一致。
第三步:由.o文件創建動態庫文件。
gcc -shared -fPIC -o libtest.so test.o
第四步:在程序中使用動態庫。
gcc -o main main.c -L. -ltest
當靜態庫和動態庫同名時,gcc命令將優先使用動態庫。
第五步:執行。
LD_LIBRARY_PATH=. ./main
示例五 查看靜態庫中的文件
[root@node56 lib]# ar -t libhycu.a
base64.c.o
binbuf.c.o
cache.c.o
chunk.c.o
codec_a.c.o

5. linux動態庫和靜態庫的區別

Linux中沒有動態庫,只有稱作共享庫的類似概念的庫。 共享庫是被編譯成二進制機器碼的可執行文件。 靜態庫是編譯成目標代碼的不可執行文件,使用靜態庫需要客戶程序通過源代碼編譯再與靜態庫一起連接的過程才能變成可執行文件

6. 在linux系統中,靜態編譯和動態編譯哪個速度快的

你說的靜態庫和動態庫吧?編譯速度沒有太大的區別,在實際運行時,靜態庫運行較快,而動態庫內地函數由於在實際使用到時才載入到內存,所以運行較慢。動態庫的好處是只要保持介面不變,就可以在程序運行時進行動態庫的切換。

7. Linux下的靜態庫和動態庫

靜態庫

可以把它想像成是一些代碼的集合,在可執行程序運行前就已經加到了代碼中,成為了執行程序的一部分,一般是以.a為後綴的文件名,Windows下後綴為.lib。靜態庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、後綴:.a。

靜態庫優缺點

上面簡單介紹了靜態庫,那它自然也會有優缺點,這里來介紹下它的優缺點。

優點:1、在最後,函數庫是被打包到應用程序中的,實現函數本地化、定址方便、高效。2、程序在運行的時候,與函數庫沒有關系,移植性更強。

缺點:1、消耗資源較大,每個進程在使用靜態庫的時候,都要復制一份才可以,這也就造成了內存的消耗。2、在程序更新、部署、發布的時候,使用靜態庫相對麻煩,如果一個靜態庫更新了,那它的應用程序都需要重新編譯,再發送給用戶,有的時候可能只是一個小的改動,但對於用戶來說,會導致整個程序重新下載。

動態庫

在程序編譯時不會被連接到目標代碼中,在後期運行時才會載入,不同的應用程序如果調用相同的庫,內存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件後綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、後綴:.so

動態庫優缺點

優點:1、節省內存2、部署、升級相對方便,只需要更換動態庫,再重新啟動服務即可。

缺點:1、載入速度比靜態庫慢2、移植性較差,需要把所有用到的動態庫進行移植。

8. linux動態庫和靜態庫的區別

動態鏈接庫和靜態鏈接庫一般是編譯集成一系列的介面(函數)
在程序源代碼編譯完成後通過編譯器編譯並通過鏈接器與這些庫進行鏈接
動態鏈接庫與靜態鏈接庫的區別在於鏈接器在進行鏈接時靜態庫會被直接編譯進程序里
而動態鏈接庫並不會,我們這里將這些鏈接庫稱作依賴(動態庫和靜態庫)
程序的運行需要這些依賴,程序在靜態鏈接後該程序本身便已包含該依賴
而動態鏈接後的程序本身本不包含該依賴,這些依賴需要執行者自行安裝進操作系統(動態庫、運行時庫)
程序運行時會動態地載入這些庫

linux上動態庫一般的後綴後為.so
靜態庫一般的後綴為.a
由於靜態鏈接會直接將庫編譯進程序里所以靜態編譯後的程序相較於動態鏈接所要大
這就是因為靜態鏈接會將鏈接庫編譯進程序里的原因,所以佔用就要大了
出於這種原因,靜態庫不易於維護與更新,如果鏈接庫中有實現有bug等需要更新則需要更新整個程序,因為靜態庫被編譯進程序中了
但動態庫就沒有這種情況了,因為動態庫是程序運行時動態載入的,所以我們只需要更新動態庫而不需要更新所有依賴該庫的程序(軟體)

另一方面,很多程序的開發都會使用到相同的鏈接庫,也就是很多程序(軟體)會有相同的依賴
如果將這些依賴全部靜態編譯的話將會造成存儲資源佔用過多而造成資源浪費
而使用動態庫的方式這些程序(軟體)則可以共享一個鏈接庫,而不需要每個程序都帶一個鏈接庫,這樣就大大地減少了存儲資源佔用空間

閱讀全文

與linux動態庫靜態編譯相關的資料

熱點內容
飛天舞國語版電影 瀏覽:925
給個在線觀看網站 瀏覽:900
英語老師作弊課 瀏覽:280
美國電影消失的眼角膜完整版電影 瀏覽:312
愛搞電影 瀏覽:702
日本電影鍵下載 瀏覽:621
人版泰山1995女演員 瀏覽:418
小電影免費小電影 瀏覽:413
三個鬼猜拳是什麼電影 瀏覽:106
法國愛情免費觀看love 瀏覽:655
查理九世百度網盤txt下載 瀏覽:171
守望者監獄潑油第幾集 瀏覽:972
那種電影在線觀看 瀏覽:123
電影演員表名字有個方框 瀏覽:675
日本生活中的瑪麗女主是誰 瀏覽:482
明天我打算去看電影英文 瀏覽:153
cofax傳真伺服器怎麼用 瀏覽:538
三極僵屍片 瀏覽:869
加工中心pdf 瀏覽:571
如何解除自動加密軟體 瀏覽:574