目錄
一、庫的概念
二、庫的知識
三、靜態庫
1、特點
2、建立
3、使用
4、小結
三、共享庫
1、特點
2、建立
3、使用
4、如何找到共享庫
5、小結
1、庫是乙個原始碼編譯後的二進位制檔案,包含的**可被程式使用
2、庫的種類:標準c庫、資料庫、執行緒庫....
4、庫的存放路徑: /lib , /usr/lib
1、庫是事先編譯好的,可以復用的**
2、在os上執行的程式基本上都要使用庫。呼叫時不需要再編譯,使用庫可以提高開發效率
3、windows和linux下庫檔案的格式不相容
4、linux下包含靜態庫(.a) 和 共享庫(動態庫.so)
5、windows 系統裡 vc 編譯器用的靜態庫副檔名一般是 .lib,動態庫副檔名一般是 .dll
1、確定庫中函式的功能、介面
2、編寫原始碼 hello.c
#include void hello(void)
3、編譯生成.o目標檔案
gcc -c hello.c4、建立靜態庫
ar crs libhello.a hello.o //ar crs 固定用法!!!1、編寫測試程式libhello.a :靜態庫檔名稱,必須以 lib開頭 .a結尾 表示是靜態庫,hello才是庫名!!!
hello.o:包含的目標檔案
#include void hello(void);
int main(void)
2、生成可執行檔案並鏈結靜態庫
gcc test.c -o test -l. -lhello
建立靜態庫1、確定庫中函式的功能、介面ar crs libhello.a hello.o //ar crs 固定用法!!!
生成可執行程式並鏈結靜態庫
gcc test.c -o test -l. -lhello
2、編寫庫原始碼hello.c、bye.c
#include void hello(void)
#include void bye(void)
3、編譯生成.o目標檔案
gcc -c -fpic hello.c bye.c4、建立共享庫-fpic:表示建立成位置無關的目標檔案
gcc -shared -o libcommon.so.1 hello.o bye.o5、為共享庫檔案建立鏈結檔案libcommon.so.1:靜態庫檔名稱,必須以 lib開頭 .so結尾 表示是動態庫,common才是庫名!!!,.1表示庫的版本
hello.o bye.o:包含的目標檔案
目的是為了編譯器在編譯的時候能找到這個共享庫
ln -s libcommon.so.1 libcommon.so1、為庫編寫乙個專門的標頭檔案,包含hello.c和bye.c中的函式定義libcommoc.so.1:目標檔案
libcommon.so:符號鏈結,必須以 lib開頭 .so結尾 表示是動態庫,.so後面不能再跟其他內容,common才是庫名!!!
2、編寫測試程式
#include #include "common.h"
int main(void)
3、生成可執行檔案並鏈結共享庫
gcc test.c -o test -l. -lcommon4、執行程式
此時執行會報找不到庫的錯誤
./test: error while loading shared libraries: libcommon.so: cannot open shared object file: no such file or directory需要先新增共享庫的載入路徑
export ld_library_path=$ld_library_path:.為了讓系統能找到要載入的共享庫,有三種方法:ld_library_path:表示庫載入路徑環境變數,這裡把當前的路徑 .追加到載入路徑中
1、把庫拷貝到/usr/lib 和 /lib 目錄下,因為這兩目錄下都是系統庫,所以不推薦
2、在 ld_library_path 環境變數中新增庫所在路徑,但是每次新建終端都需要重新新增,需要也不太好
3、修改系統配置檔案,新增 /etc/ld.so.conf.d/*.conf 檔案,執行 ldconfig 重新整理,將路徑新增到系統預設搜尋路徑中,推薦使用的!!!
生成共享庫的目標檔案gcc -c -fpic hello.c bye.c
建立共享庫
gcc -shared -o libcommon.so.1 hello.o bye.o
為共享庫建立鏈結檔案
ln -s libcommon.so.1 libcommon.so
生成可執行檔案並鏈結共享庫
gcc test.c -o test -l. -lcommon
匯出共享庫路徑
新增 /etc/ld.so.conf.d/*.conf 檔案,執行 ldconfig 重新整理
Linux下的靜態庫與動態庫
準備三個檔案 time.c time.h test.c。函式庫的標頭檔案 ifndef time h define time h includevoid time endif time h 函式庫的源程式,包含時間列印函式 include time.h void time 測試函式,呼叫了時間列印函...
Linux下的靜態庫與動態庫
1 生成.so g test.cpp fpic shared o libtest.so 2 使用.so g l.ltest main.cpp 在使用.so的時候如果找不到.so需要把.so的路徑加到 etc ld.so.conf ldconfig使之生效 ldd 可以檢視main中是否包含了.so。...
Linux下的靜態庫與動態庫
在windows和linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的 你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份 都從頭編寫,當...