如果希望把源碼 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