MinGW 与 MSVC 生成 DLL 各种情况的折腾笔记

本博文由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@
  • 11
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Mingw是一个在Windows系统上运行的开源C/C++编译器集合,而MSVC是微软的Visual C++编译器。要使用Mingw调用MSVC编译DLL,需要注意以下几点: 1. 确保DLL的函数接口使用了C或者标准C++风格的导方式,避免使用MSVC特有的扩展。 2. 确保Mingw的头文件和库文件与MSVC兼容,这样在编译时才能正确地解析和链接函数。 3. 在Mingw编译选项中,添加MSVC编译生成DLL的导入库文件。可以使用"-l"选项指定导入库的路径和名称。比如,如果DLL的导入库文件名为"example.lib",则编译命令可以添加"-lexample"选项。 4. 在运行时,确保DLL和应用程序的运行环境相匹配,包括操作系统版本、依赖的运行库版本等。特别是,如果MSVC编译时使用了动态运行时库(如MSVCRT.dll),则需要确保系统上有正确的运行时库版本。 总的来说,Mingw可以通过正确的配置和编译选项来调用MSVC编译DLL,但是要注意确保导接口的兼容性和运行时环境的一致性,以避免编译、链接和运行时的问题。 ### 回答2: Mingw是一种基于GNU工具链的开发环境,而MSVC是微软的编译器。在使用Mingw调用MSVC编译DLL时,需要注意一些细节。 首先,要确保DLL的导函数采用了标准的C调用约定,即使用`extern "C"`进行声明。这是因为Mingw默认使用C调用约定,而MSVC默认使用C++调用约定。 其次,要确保使用Mingw编译器时,指定了正确的头文件路径和库文件路径。通常情况下,MSVC编译生成的库文件的扩展名为`.lib`,而Mingw使用的是`.a`。因此在编译时要使用正确的库文件。 另外,还需要注意编译时使用相同的编译选项和标志。如果MSVC编译器使用了特定的编译选项或标志,那么在使用Mingw编译时也要保持一致,以免现不兼容或不可预料的错误。 最后,在链接时需要确保引入了正确的库文件。MingwMSVC在库文件的命名规则上可能有一些差异,要确保使用了正确的库文件。 综上所述,要使用Mingw调用MSVC编译DLL,需要注意C调用约定、头文件路径、库文件路径、编译选项和标志的一致性。只有确保这些细节正确无误,才能顺利地在Mingw环境下调用MSVC编译DLL

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值