LINUX 中的庫的問題

2021-06-27 03:06:11 字數 3131 閱讀 9224

1.    標頭檔案:用c語言及其他語言進行程式設計時,你需要標頭檔案來提供對常量的定義和對系統函式及庫函式呼叫的宣告。對於c語言來說,這些標頭檔案幾乎總是位於/usr/include 目錄及其子目錄中。那些依賴於特定linux版本的標頭檔案通常可在目錄/usr/include/sys  和/usr/include/linux中找到。

在呼叫c語言編譯器時,你可以使用 -i 標誌來包含儲存在子目錄或者非標準位置中的標頭檔案。即指定編譯程式的標頭檔案的查詢位置。如

$ gcc -i/usr/openwin/include fred.c   

$   gcc test.c –i../inc -o test

$   gcc test.c –i../inc –i../../inc2 -o test  (查詢多個位置)

它指示編譯器不僅在標準位置,也在/usr/openwin/include目錄中查詢程式fred.c  中包含的標頭檔案

標頭檔案中一般都是函式(包括庫函式)的宣告,而函式的定義則在 .c檔案中實現

用grep 命令來搜尋包含某些特定定義和函式原型的標頭檔案是很方便的。假設想知道用於從程式中返回退出狀態的#define 定義的名字,你只需要切換到/usr/include 目錄下,然後用grep 命令搜尋可能的名字部分,如

$ grep exit_  *.h

即可找到含有 exit_的標頭檔案

庫是一組預先編譯好的函式的集合,這些函式都是按照可重用的原則編寫的。它們通常由一組相互關聯的函式組成以執行某項常見的任務。

標準庫檔案一般儲存在/lib 和/usr/lib目錄中。預設情況下c語言編譯器只搜尋標準c語言庫,即上面的2個目錄。

2.庫檔案必須遵循特定的命名規範並且需要在命令列中明確指定

庫檔案的名字總是以lib 開頭,隨後的部分指明這是什麼庫,然後給出庫檔案的型別:

.a  傳統的靜態檔案庫

.so  共享的動態檔案庫

$ gcc -o fred fred.c /usr/lib/libm.a

這條命令要求編譯器編譯檔案fres.c,將編譯產生的程式檔案命名為fred.並且除了搜尋標準的c語言函式庫外,還搜尋數學庫以解決函式引用的問題,下面的命令也產生同樣的效果

$ gcc -o fred fred.c -lm

-lm是簡寫,代表標準目錄(/usr/lib)中名為libm.a的函式庫。

當然你也可以用 l 命令來改變搜尋庫的路徑。見下面

3.  靜態庫:函式庫最簡單的形式是一組處於「準備好使用」狀態的目標檔案,當程式需要使用函式庫中的某個函式時,它包含乙個宣告該函式的標頭檔案。編譯器和鏈結器負責將程式**和函式庫組合在一起以組成乙個單獨的可執行檔案。你必須使用 -l 選項指明除標準c語言執行庫外還需要使用的庫。你應盡可能把函式分別儲存到不同的原始檔中。如果函式需要訪問公共資料,你可以把它們放在同乙個原始檔中,並使用在該檔案中宣告的靜態變數。

建立靜態庫

在本例中,你將建立乙個小型的函式庫。它包含兩個函式,然後你將在乙個示例程式中呼叫其中乙個函式。這兩個函式分別是fred和bill,它們只列印歡迎資訊。

(1)首先為兩個函式分別建立各自的原始檔,(將它們分別命名為fred.c 和 bill.c ) 下面是第乙個原始檔

123

45

#include 

void fred(int arg)

下面是第二個原始檔

123

45

#include 

void bill(char *arg)

(2) 你可以分別編譯這些函式以產生要包含在庫檔案中的目標檔案。這可以通過呼叫帶有 -c選項的c語言編譯器來完成,-c 選項的作用是阻止編譯器建立乙個完整的程式。如果此時試圖建立乙個完整的程式將不會成功,因為你還未定義main函式。

$ gcc -c bill.c  fred.c

$ ls *.o

bill.o  fred.o   (此時已經生成目標檔案)

(3) 為你的庫檔案建立乙個標頭檔案,這個標頭檔案將宣告你的庫檔案中的函式,它應該被所以希望使用你的庫檔案的應用程式所包含。把這個標頭檔案包含在原始檔fred.c 和bill.c 中是個好主意,它將幫助編譯器發現所有錯誤。

12

33

void bill(char *);

void fred (int );

儲存檔案為  lib.h 這時就建立了庫檔案的標頭檔案。

(4)編譯乙個呼叫bill 函式的程式   program.c   它包含庫的標頭檔案,並且呼叫庫中的乙個函式

123

45

#include 

#include "lib.h"

int main()

bill("hello word");

exit(0);

(5)現在你可以編譯並測試這個程式了。你暫時為編譯器顯示指定目標檔案,然後要求編譯器編譯你的檔案並將其與先前編譯好的目標模組bill.o 鏈結

$ gcc -c program.c 

$ gcc -o program program.o bill.o

$ ./program

bill : we passed hello world 

(6) 現在你將建立並使用乙個庫檔案。你使用ar建立乙個歸檔檔案並將你的目標檔案新增進去。注意你可以用ar程式來建立任何型別檔案的歸檔檔案。ar是乙個通用的工具。

$ ar crv libfoo.a bill.o fred.o

a - bill.o

b - fred.o

你的函式庫現在就可以使用了,你可以在編譯器使用的檔案列表中新增庫檔案以建立你的程式如下所示。

$ gcc -o program program.o libfoo.a 

$ ./program

bill : we passed hello world 

你也可以使用 - l 選項來訪問函式庫,但因其未儲存在標準位置,所以你必須使用 -l 來告訴編譯器在何處找到它

$ gcc -o program program.o -l. -lfoo   -l. 選項告訴編譯器在當前目錄(.)中查詢函式庫。

詳見  

Linux中的動態庫

編譯動態庫命令 gcc shared fpic o so c showone.c include include myshow.h int myshow showtw.c include include myshow.h int myshow 編譯好之後,再把main函式編譯為可執行檔案 inclu...

linux中的動態庫

windows中的動態庫dll,程式要呼叫dll檔案時,要把dll檔案放到windows system32 路徑下,才可以連線到。在linux系統中,鏈結庫有預設的路徑,lib存放linux系統本身的動態庫。如果把動態庫放到 lib目錄,是可以鏈結到的。但是不建議,因為動態庫檔案可能和linux系統...

Linux中啟動資料庫問題

專案在linux系統中安裝了pg資料庫。結果單獨啟動資料庫時就出現 error while loading shared libraries libpq.so.5 cannot open shared object file錯誤 linux菜鳥表示不知道為什麼。哪位大神知道,請指導一下,謝謝。開啟....