MINGW32中dll,lib,a中的关系

本文详细介绍了在MinGW环境下进行文件转换、动态库调用及编译源码生成动态库的方法,包括从c到o、exe、dll、a文件的转换流程,以及如何在MinGW中使用自己编译的动态库,解决编译过程中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、MinGW中几种文件之间的转换

      以下引用自 http://hi.baidu.com/gjviootibjbgtyd/item/0d12b1f34cb3eeda6225d2b1

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需要修改)

                       有的MinGW版本无dumpbin.exe,不能使用dumpbin命令

                       可下载dumpbin.exe拷贝到C:\MinGW\bin目录下(未找到可以的dumpbin.exe)

dll -> def :       pexports a.dll -o > a.def (这里的-o是指给函数标序号)

                       如pexports命令不能使用可在如下地址下载

                       http://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/pexports-0.46/

                         pexports-0.46-mingw32-bin.tar.xz文件,解压,拷贝到C:\MinGW\bin目录下

lib -> def :       reimp -d a.lib

lib -> a:           (for __cdecl functions in most case) reimp a.lib; (for __stdcall functions)


二、在MinGW下使用自己编译的动态库

       在MinDW中通过libXXX.a文件调用libXXX.dll动态库。

        输入gcc -o build XXX.c -lXXX 编译不能通过,找不到调用的库函数。

        输入gcc -o build XXX.c /***/libXXX.a 编译成功。


三、在MinGW下编译源码是不能生成动态库

      在make之后出现错误:

          libtool: link: warning: undefined symbols not allowed in i686-pc-mingw32 shared libraries。

          解决办法:打开Makefile 在LDFLAGS 选项后面添加 -no-undefined 编译选项。

          执行make编译成功,但该编译过程可能不会生成.lib文件,.a文件会生成。

          拷贝.dll到vc中使用时不能链接动态库这时要手动生成.lib文件。(没有找到直接生成.lib的方法)

          1、生成.def 文件     pexports libXXX.dll > libXXX.def

               cat libXXX.def 有如下信息则成功

                     LIBRARY libXXX.dll
                          EXPORTS

                          fun              @1

             2、生成.lib文件      dlltool --dllname libXXX.dll --def libXXX.def --output-lib libXXX.lib

             生成lib文件,将libXXX.dll文件和libXXX.lib文件拷贝到vc工程目录在cpp文件中加入

             #pragma comment(lib,"libXXX.lib")   即可使用


参考资料:

http://hi.baidu.com/gjviootibjbgtyd/item/0d12b1f34cb3eeda6225d2b1

http://blog.sina.com.cn/s/blog_71d9aee40100ssnm.html

http://mingw.5.n7.nabble.com/Using-dlltool-to-create-a-lib-for-MSVC-td17116.html

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值