歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 下創建靜態庫和動態庫

4.生成庫文件

  • 概述

編寫函數代碼

編譯生成各目標文件

用ar文件對目標文件歸檔,生成靜態庫文件。注意歸檔文件名必須以lib打頭(可查看庫文件命名規則)。


使用要點:

在gcc的-I參數後加上靜態庫頭文件的路徑。

在gcc的-L參數後加上庫文件所在目錄

在gcc的-l參數後加上庫文件名,但是要去掉lib和.a擴展名。

比如庫文件名是libtest.a那麼參數就是-ltest


  • 編寫最簡單的源文件

編寫如下兩個文件,注意放在同一目錄中

myalib.h //靜態庫頭文件

myalib.c //靜態庫實現文件

  1. //myalib.h  
  2.   
  3. voidtest();  
  4.   
  5.   
  6. //myalib.c  
  7. #inlcude<stdio.h>  
  8.   
  9. voidtest()  
  10.   
  11. {  
  12.   
  13. printf("test\n");  
  14.   
  15. }  
  • 制作靜態庫文件

生成目標文件


gcc-c myalib.c

執行完後會生成一個myalib.o文件


用ar命令歸檔,格式為ar-rc <生成的檔案文件名><.o文件名列表>

再次提醒,歸檔文件名一定要以lib打頭,.a結尾。

ar-rc libtest.a myalib.o

執行完後會生成一個libtest.a文件


  • 使用靜態庫文件

編寫一個測試程序main.c,內容為

  1. //main.c  
  2.   
  3.   
  4. #include"myalib.h"  
  5.   
  6. intmain(int argc,char* argv[])  
  7.   
  8. {  
  9.   
  10. test();  
  11.   
  12. return0;  
  13.   
  14. }  

編譯目標文件,注意要把靜態庫頭文件的路徑加到-I參數裡面

gcc-I ./ -o main.o -c main.c

現在生成了一個main.o文件


生成可執行文件,注意要把靜態庫文件的路徑加到-L參數裡面,

把庫文件名(去掉打頭的lib和結尾的.a)加到-l參數後面。如下面所示


gcc-o main -L ./ main.o -ltest


此時就會生成一個名為main的可執行文件

另外,注意-l參數好象應該加到輸入文件名的後面,否則會報錯。


比如gcc-o main -L./ -ltest main.o就會提示

main.o(.text+0x11):In function `main':

:undefined reference to `test'

collect2:ld returned 1 exit status


執行可執行文件查看效果

執行./main,輸出

test

說明執行成功。


  • 生成動態庫文件

gcc-fPIC --shared test.c -o libtest.so

生成libtest.so


  • 使用動態庫文件

編譯可執行文件

gccmain.c -o main -I./ -L./ -ltest

指定加載庫的路徑,後面會詳細介紹。

exportLD_LIBRARY_PATH=./:$LD_LIBRARY_PATH


執行./main,輸出

test

說明執行成功。


5.庫文件命名

GNU庫的使用必須遵守LibraryGNU PublicLicense(LGPL許可協議)。該協議與GNU許可協議略有不同,開發人員可以免費使用GNU庫進行軟件開發,但必須保證向用戶提供所用的庫函數的源代碼。

系統中可用的庫都存放在/usr/lib和/lib目錄中。庫文件名由前綴lib和庫名以及後綴組成。根據庫的類型不同,後綴名也不一樣。共享庫的後綴名由.so和版本號組成,靜態庫的後綴名為.a。


靜態庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱

動態庫的名字一般為libxxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號,minor是副版本號

Copyright © Linux教程網 All Rights Reserved