linux怎樣編寫和編譯動態庫

2021-05-23 02:01:02 字數 2968 閱讀 1538

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 ...