本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/51918076
写这篇博客,主要是刚折腾 MinGW,相关内容网上的资料不全,而且错误很多
其实之前我根本没把这个当回事,我就想 MinGW 跟 Linux 上的 GNU 编译器不会有差别,但是事实却不是这样。。。
提示:所有代码均使用 __stdcall
安装 MSVC 和 MinGW
MSVC:安装 Visual Studio,之后即可在开始菜单中找到“Visual Studio开发人员命令提示”,启动后会自动配制环境变量,不多说了(之前我写过提取 MSVC 编译器的博客)
MinGW:这真是一个悲伤的故事,官方的下载工具总是失败,看起来需要搭梯子,其实,有一种更简单的方法。。
去 http://www.mingw.org/wiki/InstallationHOWTOforMinGW 里面下载各个组件,然后自己解压到一起就行。注意上面的页面中有的组件的连接已经失效了(但放心并不多),所以只能在 MinGW 的 Sourceforge 上一点点找了。
MSYS 环境就不用了,这个下来不好用,版本很老,不知道官方为什么不更新,其实,只需要安装一个 msysgit,MSYS 环境就有了,版本也是最新的,不过 msysgit 在 AWS 上,还是需要搭梯子才能下载。
嘿嘿,写一个超简单的脚本
#!bash
export PATH="/c/Users/abc/Downloads/MinGW/MinGW/bin:$PATH"
bash
把 /c/Users/abc/Downloads/MinGW/MinGW/bin 换成你的 MinGW/bin 目录即可,双击打开一个可以用 MinGW GCC、G++ 的 Bash 终端。
MinGW 调用 MinGW 生成的 DLL
自家调用自家的,也会出现问题,别不信,比如这儿有 dll.cpp 和 dlluse.cpp
#include <Windows.h>
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
) {
return TRUE;
}
extern "C" __declspec(dllexport) void WINAPI showMessage() {
MessageBoxA(0, "I am showMessage", 0, 0);
}
extern "C" __declspec(dllexport) void WINAPI showMessage2() {
MessageBoxA(0, "showMessage2", 0, 0);
}
#include <Windows.h>
extern "C" void WINAPI showMessage();
extern "C" void WINAPI showMessage2();
int main() {
showMessage();
}
如果我们这样编译:
$ g++ -mwindows -static -shared -o 1.dll dll.cpp -Wl,--out-implib,lib1.a
$ g++ -mwindows -static dlluse.cpp -l1 -L.
$ ./a.exe
这样是没有问题的,但是,问题出现在了 –kill-at 选项上
我们先用微软的 dumpbin 工具来看一下导出表:
> dumpbin /exports 1.dll
Microsoft (R) COFF/PE Dumper Version 14.00.23918.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file 1.dll
File Type: DLL
Section contains the following exports for 1.dll
//....
ordinal hint RVA name
1 0 000012BB showMessage2@