使用reimp根据lib生成a文件

本文介绍了如何在MinGW环境下使用reimp和dlltool从lib文件生成.a静态库,强调了环境配置和命令行选项的重要性。在处理位数不兼容问题时,将工具放置于MinGW的bin目录下是关键,同时提到了-k参数的影响以及Linux静态库的命名规范。最后指出并非所有lib文件都能生成def文件,并分享了关于32位与64位系统的兼容性问题。

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

mingw32/bin/ld.exe: skipping incompatible表示文件位数跟系统位数不对,造成不兼容,要重新生成。

将reimp copy至MinGW的bin目录下。因为MinGW的bin目录已经配置在环境变量,reimp.exe、dlltool.exe只能放在MinGW\bin的目录下才能正常生成.a文件,放在其它目录下就算能访问,生成的文件可能有问题。

C:\MinGW\bin\reimp.exe
C:\MinGW\bin\dlltool.exe
E:\Program Files\MySQL\mysql-5.6.19-win32\lib\libmysql.lib

使用reimp和dlltool
进入cmd下
cd E:\Program Files\MySQL\mysql-5.6.19-win32\lib

reimp -d libmysql.lib
dlltool -k -d libmysql.def -l libmysql.a

1.dlltool --input-def libmySQL.def --dllname libmySQL.dll --output-lib libmysql.a -k

2.dlltool -d libmysql.def -D libmysql.dll -l libmysql.a -k

1和2功能一样,在cmd下直接输reimp有使用帮助提示,dlltool -h,有使用帮助提示

-k  Kill @<n> from exported names我分开两次测试一次不加-k生成的文件有问题,报找不到方法,编译通过;另一次加-k参数,文件正确,但是打开文件看里面也有@n的参数,没搞明白是什么意思。

Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a
搜索时文件名去掉lib和后缀

Libraries(-l) mysql 搜索libmysql.a

Libraries(-l) libmysql 搜索libmysql.lib

总结:后来研究了下,发现不是所有的lib文件都能生成def文件,reimp.exe、dlltool.exe只能放在MinGW\bin目录下工作才正常,我把它复制到其它目录,运行没问题,但是生成的文件有问题,开始装的dev-c++是5.7.1版本,这版本虽然兼容32位和64位,但在它里面的MinGW64\bin目录生成a,竟然全是64位的,然后我的系统是32位,生成的东西都不能用。

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、付费专栏及课程。

余额充值