靜態 共享和動態庫的使用

2021-04-21 00:21:03 字數 2405 閱讀 3021

c語言中有一些函式不需要進行編譯,有一些函式也可以在多個檔案中使用。一般來說,這些函式都會執行一些標準任務,如資料庫輸入/輸出操作或螢幕控制等。 可以事先對這些函式進行編譯,然後將它們放置在一些特殊的目標**檔案中,這些目標**檔案就稱為庫。庫檔案中的函式可以通過連線程式與應用程式進行連 接。這樣就不必在每次開發程式時都對這些通用的函式進行編譯了。

不同型別的應用程式將會使用不同的函式庫。例如:libdbm庫中組 包含了對資料庫檔案進行訪問的dbm函式,需要對資料庫進行操作的程式就會與該庫進行連線。數學應用程式將使用數學庫libm,x-windows應用程 序將使用xlib庫,libx11。另外,所有的程式都將使用標準的c函式庫。libc,該庫中包含了諸好記憶體管理或輸入輸出操作的基本函式,這些庫都存 放在/usr/lib這些系統公用的目錄中,系統中的任何使用者都可以利用這些庫。當然使用者也可以建立自己專用的庫函式,供自己或其它指定的人員使用。

庫 可以有三種使用的形式:靜態、共享和動態。靜態庫的**在編譯時就已連線到開發人員開發的應用程式中,而共享庫只是在程式開始執行時才載入,在編譯時,只 是簡單地指定需要使用的庫函式。動態庫則是共享庫的另一種變化形式。動態庫也是在程式執行時載入,但與共享庫不同的是,使用的庫函式不是在程式執行開始, 而是在程式中的語句需要使用該函式時才載入。動態庫可以在程式執行期間釋放動態庫所占用的記憶體,騰出空間供其它程式使用。由於共享庫和動態庫並沒有在程式 中包括庫函式的內容,只是包含了對庫函式的引用,因此**的規模比較小。

已經開發的大多數庫都採取共享庫的方式。elf格式的可執行檔案使得共享庫能夠比較容易地實現,當然使用舊的a.out模式也可以實現庫的共享。linux系統中目前可執行檔案的標準格式為elf格式。

gnu庫的使用必須遵守library gnu public license(lgpl許可協議)。該協議與gnu許可協議略有不同,開發人員可以免費使用gnu庫進行軟體開發,但必須保證向使用者提供所用的庫函式的源**。

系統中可用的庫都存放在/usr/lib和/lib目錄中。庫檔名由字首lib和庫名以及字尾組成。根據庫的型別不同,字尾名也不一樣。共享庫的字尾名由.so和版本號組成,靜態庫的字尾名為.a。採用舊的a.out格式的共享庫的字尾名為.sa。

libname.so.major.minor

libname.a

這 裡的name可以是任何字串,用來唯一標識某個庫。該字串可以是乙個單字、幾個字元、甚至乙個字母。數學共享庫的庫名為libm.so.5,這裡的標 識字元為m,版本號為5。libm.a則是靜態數學庫。x-windows庫名為libx11.so.6,這裡使用x11作為庫的標識,版本號為6。

在 /usr/lib和/lib目錄中可以找到絕大多數的共享庫。連線時將首先搜尋這兩個目錄。有一些庫也可能存放在特定的目錄中,在 /etc/ld.conf配置檔案中給出了這些目錄的列表。連線程式也會對列出的這些目錄進行搜尋。在預設情況下,linux將首先搜尋指定庫的共享版 本,如果找不到,才會去搜尋靜態版本。在對共享庫進行更新或安裝新庫後,必須執行ldconfig命令更新/etc/ld.conf檔案中相應的項(如果 使用rpm進行安裝,一般會自動進行更新,不過也不能保證這一點)。

在gcc編譯器中引用可搜尋到的目錄中的庫檔案時,需要使用 -l選項和庫名。在gcc命令列上輸入-lm可以在程式中連線標準算術庫,-l將首先使用libname.so進行搜尋,這裡是libm.so。下面的例 子將使用算術庫建立bookrecs程式,請注意這裡的-lm選項。

$ gcc main.c io.c -o bookrecs -lm

系統中還有一些其它可用的庫,常用的是libncurses.a庫,包含了一些簡單的滑鼠移動例程。在命令列中使用-lncurses選項引用libncurses.so庫。下面的例子同時呼叫了數學和游標庫。

$ gcc mian.c io.c -o bookrecs -lm -lncurses

$ gcc main.c -o bookrecs -lmydir -lmyio

.a的是為了支援較老的a.out格式的可執行檔案的

.so的是支援elf格式的可執行檔案的庫。

靜態庫是指編譯連線時,把庫檔案的**全部加入到可執行檔案中,所以生成的檔案較大, 但執行時,就不再需要庫檔案了。動態庫正好相反,在編譯連線時,沒有把庫檔案的**加入到可執行檔案中,所以生成的檔案較小,但執行時,仍需要載入庫檔案

.a是靜態庫檔案,可以用ar 命令生成。

.so是動態庫檔案,編譯時加上指定的選項即可生成,具體選項看相應的系統文件了。。。。

ibm aix下如下:

$(cc) $(shopt) $(shlibs) a.o b.o -o lib$@$(dbbuildtail)

假設你有test1.c test2.c test3.c , 編寫成動態鏈結庫

1. 先編譯成test1.o test2.o test3.o

2. gcc -shared -w1, -soname,libvtest.so.1 -o libvtest.so.1.0 *.o

靜態庫和共享庫 動態庫 的區別

靜態庫和共享庫 動態庫 的區別 根據鏈結時期不同,分為靜態庫和共享庫,靜態庫是在程式編譯時鏈結的,共享庫是在程式執行時鏈結的。庫是預先編譯好的方法的集合,命名一般為libxx.a 靜態庫 libxx.so 動態庫 庫檔案常存放的地點為 lib或 usr lib,庫對應的標頭檔案一般存放在 usr i...

靜態庫,共享庫,動態載入庫

一 靜態庫 1.概念 靜態庫就是一些目標檔案的集合,以.a結尾。靜態庫在程式鏈結的時候使用,鏈結器會將程式中使用 到函式的 從庫檔案中拷貝到應用程式中。一旦鏈結完成,在執行程式的時候就不需要靜態庫了。由於每個使用靜態庫的應用程式都需要拷貝所用函式的 所以靜態鏈結的檔案會比較大。2.建立與應用 首先建...

靜態庫和共享庫

建立和使用靜態庫 1 建立目錄 mkdir p test sub 2 在子目錄sub 下編寫hello.c和hello.h hello.c include include hello.h void hello hello.h include void hello 4 在主目錄test 下編寫main...