用VC和MinGW导出dll的def和lib(a)文件

原文地址:http://zhangyafeikimi.iteye.com/blog/404580

 

有了dll文件需要导出def文件:
pexports zlib1.dll > zlib1.def

有了dll和def文件,需要导出MinGW的.a文件:
dlltool --dllname zlib1.dll --def zlib1.def --output-lib libz.dll.a

有了dll和def文件,需要导出一个VC的lib文件:
lib /machine:i386 /def:zlib1.def

注意:
C++的dll不具有2进制级别的共享性,也就是说VC的MinGW的C++ dll不能混用。
而C的可以。
pexports和dlltool的MinGW的工具,lib是VC的工具。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSVC vs. MinGW 之 (lib,dll,def,obj,exe) vs (a,dll,def,o,exe) 玩转攻略手记 一份粗糙的研究记录,有待补完和整理。 MinGW: c -> o gcc -c a.c c -> exe gcc a.c libs.o -o a.exe (从主程序a.c,附加libs,生成a.exe) o -> exe gcc a.o b.o ... -o main.exe c -> dll,def,a gcc a.c -shared -o a.dll -Wl,--output-def,a.def,--out-implib,liba.a a -> dll a2dll liba.a dll -> a: dlltool --dllname a.dll --def a.def --output-lib liba.a (需要def文件) a -> def: dumpbin /exports lib.a > lib.def (在windows上调用,def需要修改) dll -> def : pexports a.dll -o > a.def (这里的-o是指给函数标序号) lib -> def : reimp -d a.lib lib -> a: (for __cdecl functions in most case) reimp a.lib; (for __stdcall functions) MSVC: c -> lib cl /LD a.c (注意已经定义了export列表) c -> dll cl /LD a.c c -> obj cl /c a.c c -> exe cl a.c /out:a.exe dll ->lib lib /machine:ix86 /def:a.def /out:a.lib (需要def文件) obj ->lib lib a.obj b.obj... /out:mylib.lib dll ->def DUMPBIN a.dll /EXPORTS /OUT:a.def (生成def需要做修正) lib ->def reimp -d a.lib (这个要在MSYS+MinGW下用) 关于这些工具的适用范围可以很容易的理解和记忆。 dll和exe都是PE文件,所以可以使用pexports. lib和a是静态库文件,都是归档类型,不是PE格式。所以不能使用pexports. dll可以使用dlltool. lib可以使用lib, 和reimp(lib->a工具) 所有的bin文件,包括dll,exe,lib,a都可以使用dumpbin. 参考: http://hi.baidu.com/kaien_space/blog/item/5e77fafa2ba9ff16a8d3110a.html Mingw官网文档: http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs http://oldwiki.mingw.org/index.php/CreateImportLibraries http://www.mingw.org/wiki/FAQ http://hi.baidu.com/opaquefog/blog/item/9b21b6deb324e25dccbf1ab7.html http://qzone.qq.com/blog/8330936-1238659272 http://hi.baidu.com/jzinfo/blog/item/b0aa1d308de99f9da8018e00.html 本篇测试用代码: 1. main.cpp #include #include #include "mylib.h" using namespace std; int main() { char str[]="Hello world!"; printhello(str); return 0; } 2. mylib.cpp #include #include #include "mylib.h" using namespace std; void EXPORT printhello(char *str) { cout << str << endl; } 3. mylib.h #define EXPORT __declspec(
### 回答1: Mingw是一个基于GCC的开源工具集,可在Windows平台上编译和链接C/C++代码。而DLL(动态链接库)是一种将代码库以模块化方式组织的文件格式,可供其他程序在运行时共享和调用。因此,如果想要将Mingw生成DLL文件转换为LIB(静态库)文件,可以采取以下步骤: 首先,打开Mingw所在的命令行终端,并导航到DLL文件所在的目录。 然后,使用以下命令将DLL文件转换为DEF(定义)文件dlltool -D filename.dll -d filename.def -l filename.a 其中,filename.dllDLL文件的名称,filename.defDEF文件的输出名称,filename.a是LIB文件的输出名称。 接下来,使用以下命令将DEF文件转换为LIB文件dlltool --def filename.def --dllname filename.dll --output-lib filename.lib 其中,filename.def是上一步生成DEF文件名称,filename.dllDLL文件的名称,filename.libLIB文件的输出名称。 完成上述步骤后,就能够成功将Mingw生成DLL文件转换为LIB文件。值得注意的是,转换后的LIB文件仍然是用于静态链接的,而不是将代码以动态链接库方式进行共享和调用。 ### 回答2: mingw是一种开源的编程工具,而dlllib则是Windows系统中用于共享和链接的两种动态链接库文件的扩展名。 在mingw中,如果我们有一个dll文件,并且我们想要将其转换为lib文件,可以采取以下步骤: 步骤1:打开mingw命令提示符或终端窗口。 步骤2:进入dll所在的文件夹。可以使用cd命令来实现,例如:cd C:\MyDllFolder 步骤3:使用DLLTOOL命令来进行转换。输入以下命令: dlltool -d mydll.def -l mylib.a -k 这里,mydll.defdll导出符号定义文件的名称,mylib.a是要生成lib文件的名称。-k选项告诉dlltool要生成所需库文件。 步骤4:等待转换完成。一旦转换完成,你将会在当前文件夹中看到生成的mylib.a文件。 步骤5:将生成lib文件用于链接。在你的应用程序中,你可以使用生成lib文件来链接到dll中的函数和符号。 这些是将mingw dll转换为lib的基本步骤。需要注意的是,转换过程中需要确保dll文件和相应的def文件的一致性,以便能够正确生成lib文件。 ### 回答3: 将MinGW的动态链接库(DLL)转换为静态链接库(lib)可以通过以下步骤实现。 首先,需要安装MinGW工具链,确保环境变量已正确配置。然后在命令行中使用gcc命令编译源代码生成动态链接库,例如使用以下命令: ``` gcc -shared -o mydll.dll mydll.c ``` 这将生成一个名为mydll.dll的动态链接库文件。 接下来,我们需要使用gendef命令生成DLL关联的def文件。在命令行中输入以下命令: ``` gendef mydll.dll ``` 这将生成一个名为mydll.defdef文件。 现在,我们可以使用dlltool命令将def文件转换为lib文件。在命令行中输入以下命令: ``` dlltool -d mydll.def -l mylib.a -D mydll.dll ``` 这将生成一个名为mylib.a的静态链接库文件。 最后,将生成的静态链接库文件mylib.a与源代码一起使用,通过在项目中链接该库文件,即可将动态链接库转换为静态链接库。 请注意,在进行这些操作之前,确保源代码中没有使用DLL特有的函数或导出函数,否则可能会遇到编译或链接错误。 这是一个简单的示例过程,具体的操作可能因不同的环境和项目而有所不同。在实际操作中,建议参考MinGW的文档或社区资源,以获得更详细的步骤和帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值