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 (pexports mydll.dll -o > mydll.def)
lib /machine:ix86 /def:xxx.def (也有执行 lib /machine:i386 /def:avcodec-54.def /out:avcodec.lib)
(lib为VC自带的工具)
生成了lib文件后剩下的就和VC调用VC产生的dll类似了
(目前测试 Mingw产生dll时 .h文件中的函数需使用 extern "c" 声明导出函数可以使用导出变量还不可以不知道哪里还需要下点功夫)
http://blog.sina.com.cn/s/blog_5ea0192f010102ig.html