我們通常把一些公用函數(shù)制作成函數(shù)庫,供其它程序使用。函數(shù)庫分為靜態(tài)庫和動態(tài)庫兩種。靜態(tài)庫在程序編譯時 會被連接到目標代碼中,程序運行時將不再需要該靜態(tài)庫。動態(tài)庫在程序編譯時并不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要 動態(tài)庫存在。本文主要通過舉例來說明在Linux中如何創(chuàng)建靜態(tài)庫和動態(tài)庫,以及使用它們。
在創(chuàng)建函數(shù)庫前,我們先來準備舉例用的源程序,并將函數(shù)庫的源程序編譯成.o文件。 第1步:編輯得到舉例的程序--hello.h、hello.c和main.c; hello.c(見程序2)是函數(shù)庫的源程序,其中包含公用函數(shù)hello,該函數(shù)將在屏幕上輸出"Hello XXX!"。hello.h(見程序1)為該函數(shù)庫的頭文件。main.c(見程序3)為測試庫文件的主程序,在主程序中調(diào)用了公用函數(shù)hello。 #ifndef HELLO_H void hello(const char *name); #endif //HELLO_H #include <stdio.h> void hello(const char *name) #include "hello.h" int main() 第2步:將hello.c編譯成.o文件; 無論靜態(tài)庫,還是動態(tài)庫,都是由.o文件創(chuàng)建的。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件。 在系統(tǒng)提示符下鍵入以下命令得到hello.o文件。 # gcc -c hello.c # (注1:本文不介紹各命令使用和其參數(shù)功能,若希望詳細了解它們,請參考其他文檔。) (注2:首字符"#"是系統(tǒng)提示符,不需要鍵入,下文相同。) 我們運行l(wèi)s命令看看是否生存了hello.o文件。 # ls hello.c hello.h hello.o main.c # (注3:首字符不是"#"為系統(tǒng)運行結果,下文相同。) 在ls命令結果中,我們看到了hello.o文件,本步操作完成。 下面我們先來看看如何創(chuàng)建靜態(tài)庫,以及使用它。 第3步:由.o文件創(chuàng)建靜態(tài)庫; 靜態(tài)庫文件名的命名規(guī)范是以lib為前綴,緊接著跟靜態(tài)庫名,擴展名為.a。例如:我們將創(chuàng)建的靜態(tài)庫名為myhello,則靜態(tài)庫文件名就是libmyhello.a。在創(chuàng)建和使用靜態(tài)庫時,需要注意這點。創(chuàng)建靜態(tài)庫用ar命令。 在系統(tǒng)提示符下鍵入以下命令將創(chuàng)建靜態(tài)庫文件libmyhello.a。 # ar cr libmyhello.a hello.o # 我們同樣運行l(wèi)s命令查看結果: # ls hello.c hello.h hello.o libmyhello.a main.c
通過上述最后一條ls命令,可以發(fā)現(xiàn)靜態(tài)庫文件libmyhello.a和動態(tài)庫文件libmyhello.so都已經(jīng)生成,并都在當前目錄中。然后,我們運行gcc命令來使用函數(shù)庫myhello生成目標文件hello,并運行程序 hello。 # gcc -o hello main.c -L. -lmyhello # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory # 從程序hello運行的結果中很容易知道,當靜態(tài)庫和動態(tài)庫同名時, gcc命令將優(yōu)先使用動態(tài)庫。 |
|