本博客已迁移到 wenda.dreamshare.in 欢迎访问!

Mingw & VC -- DLL

Mingw 生成dll

 

gcc test.c -shared -o libtest.dll -Wl,--output-def,libtest.def,--out-implib,libtest.a

 

同时生成了 a.def liba.a

 

VC (VC6.0)生成dll

 

File->New->Win32 Dynamic-Link Library … 添加代码使用__declspec(dllexport) 或者使用def文件配置好导出函数或变量编译…

 

会生成 dll 和 lib两个文件

 

Mingw使用Mingw生成的dll

 

静态调用

gcc test_main.c –o test_main.exe –L. –llibtest

动态调用

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

posted @ 2014-07-29 22:00  北半球的天空  阅读(2289)  评论(0)    收藏  举报