Mingw 生成dll windows
gcc test.c -shared -o libtest.dll -Wl,--output-def,libtest.def,--out-implib,libtest.a api
同時生成了 a.def liba.a 函數
VC (VC6.0)生成dll 工具
File->New->Win32 Dynamic-Link Library … 添加代碼使用__declspec(dllexport) 或者使用def文件配置好導出函數或變量編譯… 測試
會生成 dll 和 lib兩個文件spa
Mingw使用Mingw生成的dll 指針
靜態調用io
gcc test_main.c –o test_main.exe –L. –llibtest 編譯
動態調用test
gcc test_main.c –o test_main.exe –lkernel32
代碼中使用
#include <windows.h>
…
HMODULE hdll = LoadLibrary("libtest.dll");
If(hdll != NULL) {
函數指針= GetProcAddress(hdll, "函數名");
函數指針();
}
動態調用使用GetProcAddress取得函數指針時必須使用生成的def文件中
指明的函數名使用g++編譯出的dll 因爲C++函數重載的緣由會改變函數名
VC使用VC生成的dll
靜態調用
Project->Setting->Link->Project Options 填入libtest.lib
編譯…
libtest.dll 拷貝至運行目錄
運行程序
動態調用
不須要libtest.lib 代碼與mingw動態調用同
注意函數名也須要使用 def文件中指明的函數名
Mingw使用VC生成的dll
兩種比較經常使用函數調用約定 __cdecl __stdcall
1、dll中函數調用約定爲__cdecl
則mingw能夠經過-l直接連接該dll
gcc sample.c –o sample.exe –L.-llib_a.dll
代碼中包含dll的頭文件而後就能夠調用dll中的函數了
2、dll中的函數調用約定爲__stdcall
則mingw就不能直接連接了
Windows底層api所有爲__stdcall調用約定不能直接調用
但mingw已經幫咱們生成了一批能夠直接調用的庫文件
在mingw安裝目錄的lib文件夾下
若是咱們想連接kernel32.dll則能夠直接使用-lkernel32
gcc會連接lib下的libkernel32.a 經過.a調用真正的kernel32.dll
若是隻有一個__stdcall調用約定的dll文件
則須要經過如下步驟本身生成.a文件
pexports xxx.dll > xxx.def
dlltool --dllname xxx.dll --def xxx.def --output-lib libxxx.dll.a
(pexports 須要到網上自行下載 dlltool爲mingw自帶的工具)
生成.a文件後就可使用-l連接在運行程序時須要將dll 放在運行目錄下
通常狀況下使用VC生成的dll文件都是__cdecl調用約定
除非定義函數時顯示指定__stdcall調用約定
所以通常狀況下 VC生成的dll mingw能夠直接經過-l選項連接
VC使用Mingw生成的dll
VC沒法使用Mingw的a文件也不能像mingw那樣直接調用dll文件
若是調用mingw生成的dll則須要經過如下步驟獲得相應的lib文件經過lib文件調用
pexports xxx.dll > xxx.def
lib /machine:ix86 /def:xxx.def
(lib爲VC自帶的工具)
生成了lib文件後剩下的就和VC調用VC產生的dll 相似了
(目前測試 Mingw產生dll時 .h文件中的函數需使用 extern "c" 聲明導出函數可使用導出變量還不能夠不知道哪裏還須要下點功夫)