什麼是dll檔案
dll 的全稱叫:動態鏈結庫程式,是為可執行檔案服務的,每個 dll 中有諸多的函式供可執行檔案主體呼叫!
在linux下的表現形式為 .so 檔案。dll 檔案與 .exe 可執行檔案同屬於 pe 檔案型別,與 .exe 檔案不同的是:dll檔案需要有重定位表以及匯出表
而 .exe 檔案不一定需要。與 dll 對應的是靜態鏈結庫,通常是 .a 檔案
為什麼需要dll
怎麼鏈結dll
編寫前的準備
dll 的編寫特別要注意你的編譯器選擇,我目前也只用了兩個主流的編譯器做過測試,乙個是微軟 visualstudio 自帶的msvc編譯器
,另乙個是 gnu 在 windows 上的mingw編譯器
如果你使用 mingw,那麼和寫普通程式區別不大;但如果你使用 msvc 的話,你就需要注意一些固定的格式,以及一些巨集定義
msvc版
直接新建乙個 dll 檔案專案,先寫乙個標頭檔案,把一些變數和函式的定義寫好,這裡有興趣的話可以了解一下#ifdef
以及extern "c" __declspec(dllimport)
,標頭檔案 header.h **如下
#ifdef mylibapi
#define mylibapi extern "c" __declspec(dllexport)
#else
#define mylibapi extern "c" __declspec(dllimport)
#endif
mylibapi int res;
mylibapi int myadd(int num1,int num2);
然後是主要的功能**,mydll.c **如下
#include #define mylibapi extern "c" __declspec(dllimport)
#include "header.h"
int res;
int myadd(int num1,int num2)
注意事項:
extern "c"
主要是排除 c++ 編譯的干擾,c++ 編譯某個函式後會變成 func@ 的形式,不方便主程式根據函式名呼叫
__declspec(dllimport)
從其它動態庫中宣告匯入函式、類、物件等供本動態庫或exe檔案使用,在沒有全域性靜態變數時可以不使用該關鍵字
__declspec(dllexport)
宣告為匯出函式、類、物件等供其它程式呼叫,如果不使用該關鍵字匯出 dll 函式,則需要 .def 檔案
mingw版
使用 mingw 編譯器的話和寫普通程式類似,只寫需要用到的函式即可,不需要 main 主函式,然後編譯成 dll 檔案即可。編譯一句搞定gcc math.c -shared -o math.dll -wl,--out-implib,math.lib,--output-def,math.def
,還能生成 .lib 以及 .def 檔案,用 c++ 的話可能還需要--kill-at
,mydll.c **如下:
#includeint add(int a,int b)
int sub(int a,int b)
int mul(int a,int b)
int div(int a,int b)
// gcc math.c -shared -o math.dll -wl,--out-implib,math.lib,--output-def,math.def
注意:
dll 程式其實也是有入口函式的-dllmain,作業系統在呼叫 loadlibrary() 執行緒的上下文中呼叫此入口函式,並且入口函式中通常會說明該 dll 被呼叫的方式!除非有特殊需求,一般不需要寫 dllmain 函式
顯式鏈結呼叫
呼叫之前 msvc 生成的 mydll_vc.dll 中的函式
#include #include int main()
myadd = (int (*)(int,int))getprocaddress(hmydll,"myadd");
printf("%d\n",myadd(99,999));
return 0;
}
呼叫之前 mingw 生成的 mydll_gcc.dll 中的函式
#include #include #include typedef int (*addfunc)(int,int);
typedef int (*subfunc)(int,int);
typedef int (*mulfunc)(int,int);
typedef int (*divfunc)(int,int);
int main()
if(sub != null)
if(mul != null)
if(div != null)
}else
freelibrary(hdll);
system("pause");
return 0;
}
隱式鏈結呼叫
在**中新增#include "..\mylib\mylib.h" 以及 #pragma comment(lib,"mylib.lib")
,並把相應的 dll 檔案放在**的目錄下,然後直接使用函式即可!
python入門指南 Python 入門指南
python 入門指南 release 3.6.3 date dec 10,2017 python 是一門簡單易學且功能強大的程式語言。它擁有高效的高階資料結構,並且能夠用簡單而又高效的方式進行物件導向程式設計。python 優雅的語法和動態型別,再結合它的解釋性,使其在大多數平台的許多領域成為編寫...
DLL初學者指南
這裡有兩個方法來載入乙個dll 乙個方法是捷徑另乙個則相比要複雜些。捷徑是只鏈結到你.lib 檔案並將.dll檔案置入你的新專案的路徑中去。因此,建立乙個新的空的win32控制台專案並新增乙個原始檔。將你做的dll放入你的新專案相同的目錄下。include include declspec dlli...
DLL初學者指南
dll初學者指南 dll project的源 及測試專案 原文出處 codeguru 我正在學習dlls,談不上對其有什麼高屋建瓴的見解 本文只是 通過 編碼讓你看到並想知道 是如何執行的。在本文中,我假定你知道如何使用你的編譯器特性,比如設定目錄路徑等等。ifndef dll tutorial h...