使用動態鏈結庫

2021-06-18 00:20:26 字數 2702 閱讀 6710

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

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

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

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

建立程式檔案

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

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

01#include

02

03#include」tiger.h」

04

05intmain(void)

06

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

1#ifndef __tiger__

2#define __tiger__

3

4intadd(inta,intb);

5intsub(inta,intb);

6

7#endif

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

1intadd(inta,intb)

2

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

1intsub(inta,intb)

2

動態庫的生成

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

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

動態鏈結庫使用 靜 動態鏈結庫使用總結

一 靜態庫編寫 1.首先當然是開vs然後建立乙個靜態庫工程啦 2.格式.一般有標頭檔案.h和原檔案.cpp,當然你也可以寫一在乙個cpp裡.mydll.h extends c mydll.cpp include mylib.h int sum int num1,int num2 int mult i...

使用動態鏈結庫

1.先建立乙個動態鏈結庫的工程 vs下,file new project win32 project dll t.h ifdef myapi export define myapi declspec dllexport else define myapi declspec dllimport end...

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...