程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 創建和使用庫:靜態、共享和動態

創建和使用庫:靜態、共享和動態

編輯:C語言基礎知識
    C語言中有一些函數不需要進行編譯,有一些函數也可以在多個文憑中使用。一般來說,這些函數都會執行一些標准任務,如數據庫輸入/輸出操作或屏幕控制等。可以事先對這些函數進行編譯,然後將它們放置在一些非凡的目標代碼文件中,這些目標代碼文件就稱為庫。庫文件中的函數可以通過連接程序與應用程序進行連接。這樣就不必在每次開發程序時都對這些通用的函數進行編譯了。
  
   不同類型的應用程序將會使用不同的函數庫。例如:libdbm庫中組包含了對數據庫文件進行訪問的dbm函數,需要對數據庫進行操作的程序就會與該庫進行連接。數學應用程序將使用數學庫libm,X-Windows應用程序將使用Xlib庫,libX11。另外,所有的程序都將使用標准的C函數庫。libc,該庫中包含了諸好內存治理或輸入輸出操作的基本函數,這些庫都存放在/usr/lib這些系統公用的目錄中,系統中的任何用戶都可以利用這些庫。當然用戶也可以建立自己專用的庫函數,供自己或其它指定的人員使用。
  
   庫可以有三種使用的形式:靜態、共享和動態。靜態庫的代碼在編譯時就已連接到開發人員開發的應用程序中,而共享庫只是在程序開始運行時才載入,在編譯時,只是簡單地指定需要使用的庫函數。動態庫則是共享庫的另一種變化形式。動態庫也是在程序運行時載入,但與共享庫不同的是,使用的庫函數不是在程序運行開始,而是在程序中的語句需要使用該函數時才載入。動態庫可以在程序運行期間釋放動態庫所占用的內存,騰出空間供其它程序使用。由於共享庫和動態庫並沒有在程序中包括庫函數的內容,只是包含了對庫函數的引用,因此代碼的規模比較小。
  
   已經開發的大多數庫都采取共享庫的方式。ELF格式的可執行文件使得共享庫能夠比較輕易地實現,當然使用舊的a.out模式也可以實現庫的共享。Linux系統中目前可執行文件的標准格式為ELF格式。
  
   GNU庫的使用必須遵守Library GNU Public License(LGPL許可協議)。該協議與GNU許可協議略有不同,開發人員可以免費使用GNU庫進行軟件開發,但必須保證向用戶提供所用的庫函數的源代碼。
  
   系統中可用的庫都存放在/usr/lib和/lib目錄中。庫文件名由前綴lib和庫名以及後綴組成。根據庫的類型不同,後綴名也不一樣。共享庫的後綴名由.so和版本號組成,靜態庫的後綴名為.a。采用舊的a.out格式的共享庫的後綴名為.sa。
   libname.so.major.minor
   libname.a
  
   這裡的name可以是任何字符串,用來唯一標識某個庫。該字符串可以是一個單字、幾個字符、甚至一個字母。數學共享庫的庫名為libm.so.5,這裡的標識字符為m,版本號為5。libm.a則是靜態數學庫。X-Windows庫名為libX11.so.6,這裡使用X11作為庫的標識,版本號為6。
  
   使用gcc編譯器就可以將庫與自己開發的程序連接起來,例如:libc.so.5中包含了標准的輸入輸出函數,當連接程序進行目標代碼連接時會自動搜索該程序並將其連接到生成的可執行文件中。標准的輸入輸出庫中包含了許多基本的輸入輸出函數,如printf函數等。也可以連接其它的一些系統函數庫,如數學庫等,但與libc.so.5不同,大部分其它的系統庫需要在命令行中顯式指定所用的庫名。
  
   在/usr/lib和/lib目錄中可以找到絕大多數的共享庫。連接時將首先搜索這兩個目錄。有一些庫也可能存放在特定的目錄中,在/etc/ld.conf配置文件中給出了這些目錄的列表。連接程序也會對列出的這些目錄進行搜索。在默認情況下,Linux將首先搜索指定庫的共享版本,假如找不到,才會去搜索靜態版本。在對共享庫進行更新或安裝新庫後,必須運行ldconfig命令更新/etc/ld.conf文件中相應的項(假如使用RPM進行安裝,一般會自動進行更新,不過也不能保證這一點)。
  
   在gcc編譯器中引用可搜索到的目錄中的庫文件時,需要使用-l選項和庫名。在gcc命令行上輸入-lm可以在程序中連接標准算術庫,-l將首先使用libname.so進行搜索,這裡是libm.so。下面的例子將使用算術庫創建bookrecs程序,請注重這裡的-lm選項。
   $ gcc main.c io.c -o bookrecs -lm
  
   系統中還有一些其它可用的庫,常用的是libncurses.a庫,包含了一些簡單的鼠標移動例程。在命令行中使用-lncurses選項引用libncurses.so庫。下面的例子同時調用了數學和光標庫。
   $ gcc mian.c io.c -o bookrecs -lm -lncurses
  
   在引用其它目錄中的庫時,需要使用-ldir選項指定該目錄。該選項指定了搜索庫函數時其它路徑。在下面的例子中,用戶在連接時使用了mydir目錄中的myio.so庫文件。
   $ gcc main.c -o bookrecs -lmydir -lmyio
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved