linux下靜態庫與動態庫的建立與使用

2021-10-12 02:56:00 字數 3086 閱讀 2192

目錄

一、庫的概念

二、庫的知識

三、靜態庫

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.c

4、建立靜態庫

ar crs libhello.a hello.o //ar crs 固定用法!!!

libhello.a :靜態庫檔名稱,必須以 lib開頭 .a結尾 表示是靜態庫,hello才是庫名!!!

hello.o:包含的目標檔案

1、編寫測試程式

#include void hello(void);

int main(void)

2、生成可執行檔案並鏈結靜態庫

gcc test.c -o test -l. -lhello

建立靜態庫

ar crs libhello.a hello.o //ar crs 固定用法!!!

生成可執行程式並鏈結靜態庫

gcc test.c -o test -l. -lhello

1、確定庫中函式的功能、介面

2、編寫庫原始碼hello.c、bye.c

#include void hello(void)

#include void bye(void)

3、編譯生成.o目標檔案

gcc -c -fpic hello.c bye.c

-fpic:表示建立成位置無關的目標檔案

4、建立共享庫

gcc -shared -o libcommon.so.1 hello.o bye.o

libcommon.so.1:靜態庫檔名稱,必須以 lib開頭 .so結尾 表示是動態庫,common才是庫名!!!,.1表示庫的版本

hello.o bye.o:包含的目標檔案

5、為共享庫檔案建立鏈結檔案

目的是為了編譯器在編譯的時候能找到這個共享庫

ln -s libcommon.so.1 libcommon.so

libcommoc.so.1:目標檔案

libcommon.so:符號鏈結,必須以 lib開頭 .so結尾 表示是動態庫,.so後面不能再跟其他內容,common才是庫名!!!

1、為庫編寫乙個專門的標頭檔案,包含hello.c和bye.c中的函式定義

2、編寫測試程式

#include #include "common.h"

int main(void)

3、生成可執行檔案並鏈結共享庫

gcc test.c -o test -l. -lcommon

4、執行程式

此時執行會報找不到庫的錯誤

./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下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的 你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份 都從頭編寫,當...