Linux下動態庫生成和使用

2021-07-30 12:34:13 字數 1925 閱讀 1645

1.動態鏈結庫是程式執行時載入的庫,當動態鏈結庫正確安裝後,所有的程式都可以使用動態庫來執行程式。動態鏈結庫是目標檔案的集合,目標檔案在動態鏈結庫中的組織方式是按照特殊方式形成的。庫中函式和變數的位址是相對位址,不是絕對位址,其真實位址在呼叫動態庫的程式載入時形成。

2.動態鏈結庫的名稱有別名(soname), 真名(realname)和鏈結名(linker name)。別名由乙個字首lib,然後是庫的名字,再加上乙個字尾「.so」構成。真名是動態鏈結庫真實名稱,一般總是在別名的基礎加上乙個小版本號,發布版本等構成。除此之外,還有乙個鏈結名,即程式鏈結時使用的庫的名字。

3.在動態鏈結庫安裝的時候,總是複製檔案到某個目錄下,然後用乙個軟連線生成別名,在庫檔案進行更新的時候,僅僅更新軟鏈結即可。

1.看乙個例項來了解如何自己生成靜態庫和使用靜態庫

建立程式檔案

1>在test資料夾下有三個檔案: main.c ,add.c,sub.c,tiger.h

2> main.c檔案中的內容:

#include

#include」tiger.h」

int  main(void)

3>.tiger.h檔案中的內容:

#ifndef __tiger__

#define __tiger__

int add(int  a,int  b);

int sub(int  a,int  b);

#endif

4>.add.c檔案中的內容

int  add(int       a, int b)

5>.sub.c檔案中的內容

int  sub(int        a, int b)

動態庫的生成

1>首先生成目標檔案,但是此時要加編譯器選項-fpic和鏈結器選項-shared,

gcc -fpic  -c  add.c

gcc -fpic  -c  sub.c

生成中間檔案add.o和sub.o

2>其次生成動態庫

gcc  -shared –o  libtiger.so  add.o sub.o

生成動態庫libtiger.so,libtiger.so就是我們生成的目標動態庫。我們以後使用動態庫和main.c程式生成可執行程式

說明:以上兩部也可以合成一步搞定:

gcc  -fpic   -shared add.c  sub.c  -o libtiger.so

2.使用動態鏈結庫

在編譯程式時,使用動態鏈結庫和靜態庫是一致的,使用」-l庫名」的方式,在生成可執行檔案的時候會鏈結庫檔案。

1>使用命令:

gcc -o  main  main.c -l  ./  -ltiger

2>-l指定動態鏈結庫的路勁,-ldtiger鏈結庫函式tiger。-ltiger是動態庫的呼叫規則。linux系統下的動態庫命名方式是lib*.so,而在鏈結時表示位-l*,*是自己命名的庫名。

3>但是程式會提示如下錯誤

error while loading shared libraries: libtiger.so: cannot open shared object file: no such file or direct

這是因為程式執行時沒有找到動態鏈結庫造成的。程式編譯時鏈結動態庫和執行時使用動態鏈結庫的概念是不同的,在執行時,程式鏈結的動態鏈結庫需要在系統目錄下才行。

4>使用以下方法可以解決此問題

a. 在linux下最方便的解決方案是拷貝libtiger.so到絕對目錄 /lib 下(但是,要是超級使用者才可以,因此要使用sudo哦,親)。就可以生成可執行程式了

b.第二種方法是:將動態鏈結庫的目錄放到程式搜尋路徑中,可以將庫的路徑加到環境變數ld_library_path中實現:

export ld_library_path=』pwd』:$ld_library_path

執行此命令後也可以生成可執行程式

Linux下C 動態庫的生成和使用

1.匯出函式的動態庫 ifndef dlltest h define dlltest h extern c int add int a,int b typedef int add t int a,int b endif include dlltest.h int add int a,int b 上述...

linux 動態庫的生成和使用

1.動態鏈結庫是程式執行時載入的庫,當動態鏈結庫正確安裝後,所有的程式都可以使用動態庫來執行程式。動態鏈結庫是目標檔案的集合,目標檔案在動態鏈結庫中的組織方式是按照特殊方式形成的。庫中函式和變數的位址是相對位址,不是絕對位址,其真實位址在呼叫動態庫的程式載入時形成。2.動態鏈結庫的名稱有別名 son...

linux 下編譯生成靜態庫和動態庫

我們此處為了說明靜態庫和動態庫的編譯,會使用示例 建立 test.h,hello.cpp 和 world.cpp,在兩個原始檔中分別實現兩個函式 此處都是示例 檔案命名不規範,理解意思即可 test.h 靜態庫標頭檔案 ifndef test define test void hello void ...