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" 声明导出函数可使用导出变量还不能够不知道哪里还须要下点功夫)

相关文章
相关标签/搜索