動態鏈結庫理解 一

2021-06-28 10:00:49 字數 1787 閱讀 8408

對於其他的程式要想訪問乙個dll中的函式的話,這些函式必須是已經被匯出的函式;那麼我們怎麼檢視乙個dll中有哪些函式是被匯出的呢?

我們用visual studio中的乙個工具檢視,具體步驟是:

1、進入dos

2、今天dll所在的路徑

3、使用dumpbin命令(如果在dos下找不到dumpbin,我們可以進入visual的安裝路徑下,bin資料夾中有乙個dumpbin.exe檔案,在bin目錄下還有乙個批處理檔案vcvars32.bat,將這個檔案拖入dos下,執行,就可以了。)

4、dumpbin -exports ***.dll     就可以檢視匯出的函式

dumpbin -imports ***.exe  檢視可執行程式的輸入資訊,包括它用到哪些dll

5、我們要想匯出dll中的函式,在每乙個函式的前面加_declspec(dllexport)

6、通過以上操作,我們可以看到我們匯出的函式的名字很怪,並不是我們定義的名字,這是由於c++編譯器的問題,為了支援函式的過載,編譯器會改編函式的名字,不同的編譯器用不同的規則進行改編。

7、我們如何匯出呢?

(1)只將lib檔案拷貝到工程下,編譯就會通過,但是執行的時候會出錯。錯誤如下圖:(圖中的路徑為搜尋dll的路徑順序)

(2)將dll拷貝過來,但是在我們使用dll中的函式的時候,要宣告一下我們的函式是在外部定義的,如下:

_declspec(dllimport) int add(int a, int b) 或 extern int add(int a, int b)

_declspec(dllimport) 這句話相當於我們告訴編譯器我們的函式是從.lib中輸入的,這樣效率更好。

(3)我們也可以將_declspec(dllimport) int add(int a, int b)寫在乙個.h檔案中然後,在呼叫dll中函式的地方新增該.h檔案。

note:在dll中,只有匯出的函式才可以被使用。沒有匯出的函式,是不能夠被訪問的。

二:在dll中我們還可以匯出乙個c++的類,如何匯出?和匯出函式一樣,舉個例子吧,看**:

dll1.h

#ifdef dll1_api

#else

#define dll1_api _declspec(dllimport)

#endif

dll1_api int add(int a,int b);

dll1_api int subtract(int a,int b);

class dll1_api point

;

dll1.cpp

#define dll1_api _declspec(dllexport)

#include "dll1.h"

#include #include int _stdcall add(int a,int b)

int _stdcall subtract(int a,int b)

void point::output(int x,int y)

使用上面函式**,mfc對話方塊三個按鈕的**,不要忘記加入上面的dll1.h標頭檔案

void cdlltestdlg::onbtnadd() 

void cdlltestdlg::onbtnsubtract()

void cdlltestdlg::onbtnoutput()

動態鏈結庫 一

形式1 返回型別 函式名 參數列 char pfun int char glfun int a void main 形式1 typedef 返回型別 新型別 參數列 typedef char ptrfun int ptrfun pfun char glfun int a void main depe...

動態鏈結庫 靜態鏈結庫

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

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...