Makefile 生成(動)靜態庫文件


 如果希望把源碼 file1.c、flle2.c、...fileN.c 做成庫文件,我們可以分別通過下面命令把他們制作成靜態庫或動態庫:
靜態庫:
gcc -c file1.c
gcc -c file2.c

...

gcc -c fileN.c

此時會生成file1.o,file2.o ... fileN.o文件

ar -rcs libname.a file1.o file2.o ... fileN.o

生成 libname.a 文件 即靜態庫文件。

  • 靜態庫文件名的命名方式是“libxxx.a”,庫名前加”lib”,windows和linux下都是后綴用”.a”,“xxx”為靜態庫名,windows下的靜態庫名也叫libxxx.a;
  • 鏈接時間: 靜態庫的代碼是在編譯過程中被載入程序中。
  • 鏈接方式:靜態庫的鏈接是將整個函數庫的所有數據都整合進了目標代碼。這樣做優點是在編譯后的執行程序不在需要外部的函數庫支持,因為所使用的函數都已經被編進去了。缺點是,如果所使用的靜態庫發生更新改變,你的程序必須重新編譯

 

 

 動態庫:

gcc -shared -fPIC -o libname.so file1.c file2.c ... fileN.c

生成libname.so文件

  • 動態庫的命名方式與靜態庫類似,前綴相同為“lib”,linux下后綴名為“.so(shared object)”即libxxx.so;而windows下后綴名為“.dll(dynamic link library)”即libxxx.dll;
  • 鏈接時間:動態庫在編譯的時候並沒有被編譯進目標代碼,而是當你的程序執行到相關函數時才調用該函數庫里的相應函數。這樣做缺點是因為函數庫並沒有整合進程序,所以程序的運行環境必須提供相應的庫。優點是動態庫的改變並不影響你的程序,所以動態函數庫升級比較方便

 

 

 

 

使用靜態庫或動態庫連接編譯:

編譯時找不到函數的定義,這是要通過   -l+庫文件名  來指定編譯所需的庫文件(注:庫文件名為libname.so文件中的 name)。

這時,顯示在/usr/bin/ld目錄下沒有找到 crc-t 庫文件,這是因為鏈接器在鏈接時默認到系統動態庫路徑(/lib、/lib64、/usr/lib) 下查找相應的庫文件。如果沒找到就報錯。可以通過 -L選項來指定的 查找庫的路徑。

 

Makefile文件:

 1 crc=crc_itu_t      //源文件
 2 cc=gcc
 3 headfile_path=/home/iot/dingxi/headfile/   //指定頭文件路徑
 4 lib_path=/home/iot/dingxi/lib/             //指定庫文件路徑
 5 
 6 target:
 7      ${cc} -shared -fPIC -o libtem.so ${crc}.c -I ${headfile_path}  //生成動態庫
 8      
 9 client:
10     ${cc}  tlvcli.c -o cli -I ${headfile_path}  -lcec_t  -L${lib_path}  //連接庫編譯
11 server:
12     ${cc}  sertlv.c -o ser  -I ${headfile_path}  -lcec_t -L${lib_path}
13 clear:
14     rm *.o
15 
16 makefile

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM