動態鏈結庫

2021-09-30 04:52:49 字數 2359 閱讀 5078

1 dll.cpp檔案:

_declspec(dllexport) int add(int a, int b)

在其他工程中用add的時候要寫上下面這句話:

_declspec(dllimport) int add(int a, int b);也可以是:extern int add(int a, int b);

2 dll.**件:

#ifdef  dll_api

#else

#defune  dll_api  _declspec(dllimport)

#endif

dll_api  int add(int a, int b);

dll.cpp檔案:

#define  dll_api  _declspec(dllexport)

#include"dll.h"

int add(int a, int b)

3動態鏈結庫中匯出類

dll.**件:

#ifdef  dll_api

#else

#defune  dll_api  _declspec(dllimport)

#endif

class  dll_api  point

; dll.cpp檔案:

#define  dll_api  _declspec(dllexport)

#include"dll.h"

#include"windows.h"  //使用了windows api函式

#include"stdio.h"     //c標準輸入輸出標頭檔案

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

4 防止c++和c語言相互呼叫名字改變

dll.**件:

#ifdef  dll_api

#else

#defune  dll_api  extern "c"  _declspec(dllimport)  //c是大寫的

#endif

dll_api  int add(int a, int b);

dll.cpp檔案:

#define  dll_api  extern "c"  _declspec(dllexport)

#include"dll.h"

int add(int a, int b)

extern "c" 的缺點是不能匯出類的成員函式,只能到處全域性函式。而且匯出函式呼叫約定改變了名字還是會改變。

dll_api  int add(int a, int b); 是c呼叫約定

dll_api  _stdcall  int add(int a, int b); 是標準呼叫約定

所以可以用模組定義檔案來解決名字改變問題:

dll.**件:

#ifdef  dll_api

#else

#defune  dll_api  _declspec(dllimport)

#endif

dll_api  int add(int a, int b);

dll.cpp檔案:

#define  dll_api  _declspec(dllexport)

#include"dll.h"

int add(int a, int b)

在工程目錄下新建文字檔案,重新命名為dll.def,再新增到工程中。內容為:

library  dll

exports

add5 動態載入動態鏈結庫的匯出函式

在用到動態鏈結庫函式的地方寫如下的**來載入dll:

hinstance hinst;

hinst = loadlibrary("dll.dll");

typedef int (*addproc)(int a, int b);

// getprocaddress得到指定匯出動態鏈結庫的函式位址,返回值是函式位址

addproc add = (addproc)getprocaddress(hinst, "add");

//也可以通過序號來訪問動態鏈結庫函式,makeintresource將序號轉化為字串

//addproc add = (addproc)getprocaddress(hinst, makeintresource(1));

add (5, 3);

freelibrary(hinst);

如果dll中add是這樣定義的:int _stdcall add(int a, int b);那麼typedef int (*addproc)(int a, int b)應該為typedef int (_stdcall  *addproc)(int a, int b);

動態載入動態鏈結庫只需要dll檔案就可以,不需要lib檔案

動態鏈結庫 靜態鏈結庫

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

靜態鏈結庫 動態鏈結庫

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

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...