Mingw & VC -- DLL

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

 

1dll中函數調用約定爲__cdecl

mingw能夠經過-l直接連接該dll

gcc sample.c –o sample.exe –L.-llib_a.dll

代碼中包含dll的頭文件而後就能夠調用dll中的函數了

 

2dll中的函數調用約定爲__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 須要到網上自行下載 dlltoolmingw自帶的工具)

生成.a文件後就可使用-l連接在運行程序時須要將dll 放在運行目錄下

 

通常狀況下使用VC生成的dll文件都是__cdecl調用約定

除非定義函數時顯示指定__stdcall調用約定

所以通常狀況下 VC生成的dll mingw能夠直接經過-l選項連接

 

VC使用Mingw生成的dll

 

VC沒法使用Mingwa文件也不能像mingw那樣直接調用dll文件

若是調用mingw生成的dll則須要經過如下步驟獲得相應的lib文件經過lib文件調用

 

pexports xxx.dll > xxx.def

lib /machine:ix86 /def:xxx.def

(libVC自帶的工具)

 

生成lib文件後剩下的就和VC調用VC產生的dll 相似了

 

(目前測試 Mingw產生dll .h文件中的函數需使用 extern "c" 聲明導出函數可使用導出變量還不能夠不知道哪裏還須要下點功夫)

相關文章
相關標籤/搜索