當前位置:才華齋>計算機>作業系統>

關於在Linux平臺上接靜態庫和共享庫的使方法

作業系統 閱讀(1.45W)

1、Linux函式庫介紹

關於在Linux平臺上接靜態庫和共享庫的使方法

函式庫可以看做是事先編寫的函式集合,它可以與主函式分離,從而增加程式開發的複用性。Linux中函式庫可以有3種使用的形式:靜態、共享和動態。

1)靜態庫的程式碼在編譯時就已連線到開發人員開發的應用程式中;

2)而共享庫只是在程式開始執行時才載入;

3)動態庫也是在程式執行時載入,但與共享庫不同的是,動態庫使用的庫函式不是在程式執行使開始載入,而是在程式中的語句需要使用該函式時才載入。動態庫可以在程式執行期間釋放動態庫所佔用的記憶體,騰出空間供其他程式使用。

注:

l由於共享庫和動態庫並沒有在程式中包括庫函式的內容,只是包含了對庫函式的引用,因此程式碼的規模比較小。

l系統中可用的庫大都存放在/usr/local/lib、/usr/lib、/lib、目錄中。

l標頭檔案大都放在/usr/include、/usr/local/include目錄下。

l共享庫的相關配置檔案和管理命令如下:

/etc/:包含共享庫的搜尋位置。

ldconfig:共享庫管理工具,一般在更新了共享庫之後要執行該命令。

ldd:可以檢視可執行檔案所使用的共享庫。

l庫檔名由字首lib和庫名以及字尾組成,根據庫的型別不同,字尾名也不一樣。

2、大量使用庫檔案的主要原因

1)為了便於程式設計,對於部分經常使用的函式,相應的開發語言都提供了對應的庫檔案支援。

2)隱藏具體的函式實現細節。程式設計師在使用庫檔案時,只需要包含所需要函式所在的標頭檔案,而不必關心該函式的具體實現。對於商業軟體來說,其智慧財產權也得到了一定的保護。

3、使用這些庫函式都有什麼途徑

在任何程式設計環境中,庫檔案都是一些預先編譯好的函式集合,這些函式以二進位制程式碼形式儲存在庫檔案中。使用者要使用這些函式,只需要包含這些庫檔案即可。一般來說,要從庫檔案獲得相應的函式有兩種辦法。

1)在編譯時將庫中相應函式的二進位制映像程式碼直接拷貝到當前編譯的`程式中,當前程式是獨立執行的。這種庫我們叫做靜態庫,在Linux中,以.a為字尾的為靜態庫。

2)在編譯時只引用庫中相應函式的二進位制映像程式碼的入口地址(不直接拷貝),該程式在執行時從共享庫檔案中讀出該函式程式碼(這需要首先將共享庫載入到記憶體中),從而間接引用,這種庫我們稱之為共享庫,在Linux中,以.x.x為格式命名。

4、具體如何使用

使用靜態庫、共享庫和動態庫三種類型的方法很相似,都是使用選項是“-l”(注意這裡是小寫的“L”)。該選項是用於指明具體使用的庫檔案。由於在Linux中函式庫的命名規則都是以“lib”開頭的,因此,這裡的庫檔案只需填寫lib之後的內容即可。如:有靜態庫檔案libm.a,在呼叫時只需寫作“-lm”;同樣對於動態庫檔案;在呼叫時也只需寫作“-lm”即可,其整體呼叫命令類似如下:

[root@localhost gcc]# gcc -o dynamic –L /root/lq/testc/lib/ dynamic.o -lmydynamic

那麼,若系統中同時存在檔名相同的靜態庫檔案和動態庫檔案時,該連結選項究竟會呼叫靜態庫檔案還是動態庫檔案呢?經測試後可以發現,系統呼叫的是動態庫檔案,這是由於Linux系統中預設的是採用動態連結的方式。這樣,若使用者要呼叫含有同名動態庫檔案的靜態庫檔案,則在“-l”後需要顯示地寫出包含字尾名的檔名,如:要呼叫libm.a庫檔案時就需寫作“-llibm.a”。

1)如果你已經有一個靜態庫檔案libhello.a,此庫檔案的標頭檔案為libhello.h,其內容如下:

#ifndef __libhello_H__

#define __libhello_H__

void print_hello(void); //print hello world,this is library to console

#endif __libhello_H__

我們可以從上面的程式碼看出,標頭檔案知道libhello.a庫檔案包含了print_hello()函式,其返回值型別和引數都為空。因此,在編寫程式時,你只需要使用此函式(在包含標頭檔案的前提下),而不用去管其具體實現細節。