国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

舉例剖析Linux動態庫和靜態庫

2024-08-27 23:55:42
字體:
來源:轉載
供稿:網友
  函數庫分為靜態庫和動態庫兩種。創建Linux靜態庫和Linux動態庫和使用它們在這里將以舉例的形式詳述一下。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。動態庫在程序編譯時并不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。
 
  第1步:編輯得到舉例的程序--hello.h、hello.c和main.c;
 
  hello.h(見程序1)為該函數庫的頭文件。
 
  hello.c(見程序2)是函數庫的源程序,其中包含公用函數hello,該函數將在屏幕上輸出"Hello XXX!"。
 
  main.c(見程序3)為測試庫文件的主程序,在主程序中調用了公用函數hello。

  第2步:將hello.c編譯成.o文件
 
  無論靜態庫,還是動態庫,都是由.o文件創建的。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件。在系統提示符下鍵入以下命令得到hello.o文件。
 
  # gcc -c hello.c
 
  第3步:由.o文件創建靜態庫
 
  靜態庫文件名的命名規范是以lib為前綴,緊接著跟靜態庫名,擴展名為.a。例如:我們將創建的靜態庫名為myhello,則靜態庫文件名就是libmyhello.a。在創建和使用靜態庫時,需要注意這點。創建靜態庫用ar命令。在系統提示符下鍵入以下命令將創建靜態庫文件libmyhello.a。
 
  # ar cr libmyhello.a hello.o
 
  第4步:由.o文件創建動態庫文件
 
  動態庫文件名命名規范和靜態庫文件名命名規范類似,也是在動態庫名增加前綴lib,但其文件擴展名為.so。例如:我們將創建的動態庫名為myhello,則動態庫文件名就是libmyhello.so。用gcc來創建動態庫。在系統提示符下鍵入以下命令得到動態庫文件libmyhello.so。
 
  # gcc -shared -fPCI -o libmyhello.so hello.o
 
  第5步:在程序中使用動態庫
 
  在程序中使用動態庫和使用靜態庫完全一樣,也是在使用到這些公用函數的源程序中包含這些公用函數的原型聲明,然后在用gcc命令生成目標文件時指明動態庫名進行編譯。我們先運行gcc命令生成目標文件,再運行它看看結果。
 
  # gcc -o hello main.c -L. -lmyhello  
  # ./hello  
  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
  #
  哦!出錯了。快看看錯誤提示,原來是找不到動態庫文件libmyhello.so。程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。我們將文件libmyhello.so復制到目錄/usr/lib中,再試試。
 
  # mv libmyhello.so /usr/lib  
  # ./hello  
  Hello everyone!
  #
  成功了。這也進一步說明了動態庫在程序運行時是需要的。
 
  我們回過頭看看,發現使用靜態庫和使用動態庫編譯成目標程序使用的gcc命令完全一樣,那當靜態庫和動態庫同名時,gcc命令會使用哪個庫文件呢?抱著對問題必究到底的心情,來試試看。先刪除 除.c和.h外的 所有文件,恢復成我們剛剛編輯完舉例程序狀態。
 
  # rm -f hello hello.o /usr/lib/libmyhello.so  
  # ls  
  hello.c hello.h main.c
  #
  在來創建靜態庫文件libmyhello.a和動態庫文件libmyhello.so。
 
  # gcc -c hello.c  
  # ar cr libmyhello.a hello.o  
  # gcc -shared -fPCI -o libmyhello.so hello.o  
  # ls  
  hello.c hello.h hello.o libmyhello.a libmyhello.so main.c
  #
  通過上述最后一條ls命令,可以發現靜態庫文件libmyhello.a和動態庫文件libmyhello.so都已經生成,并都在當前目錄中。然后,我們運行gcc命令來使用函數庫myhello生成目標文件hello,并運行程序 hello。
 
  # gcc -o hello main.c -L. -lmyhello  
  # ./hello  
  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory
  #
  從程序hello運行的結果中很容易知道,當Linux靜態庫和Linux動態庫同名時, gcc命令將優先使用動態庫。
 
 

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿瓦提县| 东莞市| 湖南省| 台山市| 常山县| 东方市| 洛宁县| 青阳县| 布尔津县| 石家庄市| 常德市| 阿克| 敖汉旗| 湘乡市| 淮阳县| 文化| 淮南市| 永吉县| 龙陵县| 东兴市| 柏乡县| 寿宁县| 桦南县| 施甸县| 四会市| 哈尔滨市| 盐津县| 石林| 年辖:市辖区| 偏关县| 北碚区| 茶陵县| 庐江县| 慈溪市| 缙云县| 天津市| 松潘县| 延庆县| 金乡县| 张家港市| 泽州县|