文章目录

一、.dll生成导入库.a或者.lib

在使用Mingw进行开发时,有时依赖的库只有.dll文件,而Mingw需要的是.a文件,这时就需要通过.dll文件生成一个.a文件。

以libmysql.dll为例,说明如何生成libmysql.a:

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

第一条命令会生成一个libmysql.def文件供第二条命令使用。 第二条命令使用前面生成的def文件以及dll文件生成.a文件并把导出名称中的@N去掉。 dlltool也可以替换成llvm-dlltool,但是需要指定目标机器

1llvm-dlltool -m i386:x86-64 -d libmysql.def -D libmysql.dll -l libmysql.a -k

如果要生成.lib改一下扩展名即可。

其实目前Mingw GCC是可以直接使用MSVC生成的导入库lib的,只需要改一名扩展名为.a,并在前面加上lib前缀即可,比如有一个MSVC的导入库为abc.lib,改为libabc.a即可。

二、静态lib库转dll库

有时我们编译的是静态库lib,但是希望从这个lib生成对应的dll。 首先需要在控制台运行一下VS安装目录中的vcvars32.bat(以VS2015为例,路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin)以初始话编译环境,然后用类似于下面的命令:

1link /out:xxxx.dll /implib:importxx.lib /dll /nologo /machine:YYY libstaticxx.lib /subsystem:console /def:xxxx.def

其中: libstaticxx…lib是一个静态库 xxxx.dll 链接后产生的DLL importxx.lib 生成导入库importxx.lib YYY 是目标机器,可为x86或者x64 xxx.def 是导出符号文件,如果只有一个静态库lib,可以尝试:

1dlltool -z xxx.def xxx.lib --export-all-symbols

如果直接在cmd下,没有调用vcvars32.bat脚本,则需要使用/nodedefault:xxx.lib,将dll依赖的系统lib文件添加到命令行中,这样比较麻烦,所以建议还是先运行vcvars32.bat脚本。