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...