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