靜態庫製作

轉載於:http://it.kswchina.com/Linux/zh/412503_3.html

我們看到,結果和預期的一樣,產生的隨機數的平均值正好在隨機數範圍的中間值附近。然而,我們想要的可不是把所有源代碼編譯成單個映像,而是建立一個隨機數函數庫。別急,我們現在就開始使用ar實用程序來達到此目。您可以通過下面的命令,在獲得最終的二進制映像的同時,還會生成我們的第一個靜態庫。



$ gcc -c -Wall initapi.c
$ gcc -c -Wall randapi.c
$ ar -cru libmyrand.a initapi.o randapi.o

$



  這裏,我們首先使用gcc編譯了兩個源文件initapi.c和randapi.c,其中-c選項是告訴gcc僅編譯而不鏈接,並開啓所有警告。接下來,我們使用ar命令來生成咱們的程序庫libmyrand.a.其中cru選項是創建或者添加存檔時的標準設置,c選項表示要建立靜態庫,如果靜態庫早已存在,則忽略該選項。選項r的作用是讓ar替換靜態庫中的現有目標,當然是它們業已存在的話。

  最後,選項u的作用是爲保險起見,只有當新生成的目標文件比存檔中原有的目標文件要新時才替換同名的目標文件。

  如今,我們已經得到了一個名爲libmyrand.a的新文件,它就是我們想要的靜態庫。該靜態庫中存有兩個目標程序,即initapi.o和randapi.o.那麼,我們如何利用這個靜態庫來構建應用程序呢?別急,繼續往下看。方法很簡單,如下所示:



$ gcc test.c -L. -lmyrand -o test

$ ./test
getRand() Average 4
getSRand() Average 0.499892
$



  這裏,我們首先使用gcc來編譯test.c,然後利用libmyrand.a連接目標程序test.o,這樣就得到了可執行文件。選項-L.的作用是告訴gcc,程序庫在當前子目錄中。(這裏的點號。表示目錄)。

  注意,我們也可以爲程序庫指定具體的子目錄,如-L/usr/mylibs.選項-L用來標識要用的程序庫。還要留意的是,這裏的myrand並不是我們的程序庫的名稱,我們的程序庫的名稱是libmyrand.a.使用-L時,系統會替我們在指定的名稱的前後分別加上lib和。a,因此,如果我們在此規定-ltest的話,系統將查找名爲libtest.a的程序庫。

  我們已經瞭解了創建程序庫以及使用它來構建應用程序的方法,現在讓我們繼續探討一下ar程序的用法。我們可以通過-t選項來調查靜態庫中到底包含了哪些內容,如下所示:



$ ar -t libmyrand.a
initapi.o
randapi.o
$



  如果需要的話,我們還可以刪除靜態庫中的目標程序,爲此需要用到-d選項,如下所示:



$ ar -d libmyrand.a initapi.o
$ ar -t libmyrand.a

randapi.o
$



  這裏要引起注意的是,使用上述命令ar執行刪除任務失敗時,它是不會通知我們的,要想查看出錯信息,需要添加-v選項,如下所示:



$ ar -d libmyrand.a initapi.o
$ ar -dv libmyrand.a initapi.o
No member named ‘initapi.o’
$



  在前一種情況下,如果我們試圖刪除目標文件initapi.o,儘管該靜態庫中並沒有這個文件,但是卻沒有產生任何錯誤消息。在第二種情況下,我們添加v選項後就得到了相應的錯誤信息。我們不僅可以從靜態庫刪除目標文件,還可以通過-x選項來從中提取目標文件,如下所示:



$ ar -xv libmyrand.a initapi.o
x - initapi.o
$ ls
initapi.o  libmyrand.a
$ ar -t libmyrand.a
randapi.o
initapi.o
$



  選項-x和-v結合使用後,我們能夠得到更多的信息。提供在相應子目錄中鍵入ls命令,我們就能看到實用程序ar提取的文件。這裏我們要注意的是,我們同時還列出了提取文件後的靜態庫的內容,我們發現initapi.o仍然在那裏,也就是說,提取選項實際上並沒有刪除靜態庫中的目標文件,而只是複製了一份而已。要想刪除靜態庫中的目標文件,必須使用刪除選項-d.


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