LINUX 中的庫的問題

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 ) 下面是第一個源文件

 1
 2
 3
 4
 5
#include <stdio.h>
void fred(int arg)
{
printf("fred: we passed %d\n",arg);
}
下面是第二個源文件

 1
 2
 3
 4
 5
#include <stdio.h>
void bill(char *arg)
{
printf("bill: we passed %s\n",arg);
}
(2) 你可以分別編譯這些函數以產生要包含在庫文件中的目標文件。這可以通過調用帶有 -C選項的C語言編譯器來完成,-C 選項的作用是阻止編譯器創建一個完整的程序。如果此時試圖創建一個完整的程序將不會成功,因爲你還未定義main函數。

$ gcc -c  bill.c  fred.c

$ ls *.o

bill.o  fred.o   (此時已經生成目標文件)

(3) 爲你的庫文件創建一個頭文件,這個頭文件將聲明你的庫文件中的函數,它應該被所以希望使用你的庫文件的應用程序所包含。把這個頭文件包含在源文件fred.c 和bill.c 中是個好主意,它將幫助編譯器發現所有錯誤。

 
 1
 2
 3
 3
void bill(char *);
void fred (int );
保存文件爲  lib.h 這時就創建了庫文件的頭文件。

(4)編譯一個調用bill 函數的程序   program.c   它包含庫的頭文件,並且調用庫中的一個函數

 1
 2
 3
 4
 5
#include <stdio.h>
#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. 選項告訴編譯器在當前目錄(.)中查找函數庫。

  

詳見  http://blog.csdn.net/olinxi1234567/article/details/41478113

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章