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
.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
二、正確編譯與命名動態鏈結庫: g++ -shared -fpic -wall -o libmy.so getdate.cc gettime.cc
########### makefile ############
obj = libmy.so
cc = g++
all : $(obj)
src = getdate.cc gettime.cc
tgt = $(src:.cc=.o)
$(src) : adatetime.h
@touch $@
%.o : %.c
$(cc) -c $?
$(obj) : $(tgt)
$(cc) -shared -fpic -wall -o $@ $(tgt)
gcc -shared -fpic -o libjcmpp.so jcmpp.c libtssx_cmpp.a -i. -i/opt/jdk142/include/ -i/opt/jdk142/include/linux
linux下動態庫的編寫和呼叫
linux下編寫和呼叫乙個簡單的動態庫大概分為以下幾個步驟 int add int a,int b ifndef head define head int add int a,int b endifgcc fpic c add cgcc shared o libhead.so add.o inclu...
Linux下編譯靜態庫 a 和動態庫 so
靜態庫 在linux環境中,使用ar命令建立靜態庫檔案.如下是命令的選項 d 從指定的靜態庫檔案中刪除檔案 m 把檔案移動到指定的靜態庫檔案中 p 把靜態庫檔案中指定的檔案輸出到標準輸出 q 快速地把檔案追加到靜態庫檔案中 r 把檔案插入到靜態庫檔案中 t 顯示靜態庫檔案中檔案的列表 x 從靜態庫檔...
linux 下編譯生成靜態庫和動態庫
我們此處為了說明靜態庫和動態庫的編譯,會使用示例 建立 test.h,hello.cpp 和 world.cpp,在兩個原始檔中分別實現兩個函式 此處都是示例 檔案命名不規範,理解意思即可 test.h 靜態庫標頭檔案 ifndef test define test void hello void ...