使用鏈結庫

2021-04-23 23:13:18 字數 1836 閱讀 4792

c++裡常使用鏈結庫有兩種方式:一種為靜態的,使用lib庫;另外一種是使用動態鏈結庫,分為兩種情況:1>將.h檔案和lib檔案載入到程式中,把dll檔案和程式放在同一目錄;2>程式中呼叫loadlibrary和freelibrary動態載入和釋放dll檔案。

下面看兩個對應的小例子:

1.使用靜態鏈結庫

首先建立乙個空工程,修改工程生成的是lib庫。**:

//----dllmain.h----

//提供函式介面

#pragma once 

extern

"c"int __stdcall add(int a,int b);  //使用extern "c"修飾匯出介面為c函式

//----dllmain.cpp----

#include "dllmain.h"

int __stdcall add(int a,int b)

這樣編譯就能生成lib檔案了。使用depends檢視函式介面:有乙個函式名為_add@8

然後可以建立乙個專案使用此lib庫,首先應該在工程屬性裡把lib檔案設定為編譯依賴庫:

#include 

#include "../staticdlltest/dllmain.h"  //將必要的函式介面說明標頭檔案包含進來 

using

namespace std;

int main()

到此靜態鏈結庫就可以使用了,需要:lib檔案和.h函式介面說明檔案

2.使用動態鏈結庫

建立乙個空工程,設定工程屬性生成dll檔案。**:

//dllmain.h

//標頭檔案用於說明函式介面

#pragma once

//#include 

extern

"c" __declspec(dllexport) int __stdcall add(int a, int b);

//注意生成dll匯出函式介面需要dllexport關鍵字

//dllmain.cpp

#include "dllmain.h"

int __stdcall add(int a, int b)

這樣編譯成功後就生成了乙個dll和乙個lib檔案。

1>使用lib .h dll 執行時動態,把頭檔案和lib檔案包含進來;

#include 

#include "../dynamicdll/dllmain.h"

#pragma comment(lib,"../bin/dynamicdll.lib") //加入lib庫

using

namespace std;

int main()

程式執行需要dll檔案,所以要把dll檔案和執行程式放在同一目錄下。

2>只使用dll檔案:

#include 

#include 

using

namespace std;

typedef

int (__stdcall *pfun)(int,int);

int main()

需要說明的是載入dll函式loadlibrary須知道dll檔名才能呼叫,然後getprocaddress也是根據匯出dll檔案裡的函式名來取得函式的位址的。還有函式名_add@8

是未經過匯出模組定義時生成的dll檔案裡函式名就是這樣了,如果使用def檔案定義後匯出的c風格函式就會像這樣「add」沒有那些標記符號。def檔案內容格式如下:

library "dynamicdll"

exports

add   @1

好了,到此常規的鏈結庫學習就完成了,另外還有兩類鏈結庫和mfc有關,暫時不多研究。

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

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

使用動態鏈結庫

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