一、MinGW中几种文件之间的转换
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.liblib -> 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