使用MinGW工具创建MSVC导入库

时间:2017-11-28 22:08:03

标签: visual-c++ cross-compiling mingw-w64 import-libraries

我们目前正在将VisualStudio的跨平台(linux,osx,w32)项目的W32构建过程转换为mingw。

我们面临的一个问题是,我们的项目会创建一个动态库(foo.dll),第三方项目可以链接到该库。为了在W32 / MSVC上工作,需要导入库(foo.lib)。

现在,在Holger之后,创建一个.def文件非常容易,该文件包含导入库所需的所有信息:

 gcc -shared -o foo.dll foo-*.o -Wl,--output-def,foo.def

为了使用foo.def文件,文档告诉我使用 Microsoft LIB 工具从中构建foo.lib

 lib /machine:i386 /def:testdll.def

这显然要求我在构建计算机上安装(子集)MSVC。 但是,我们想在我们的Linux系统上交叉编译整个东西(可能甚至在某些CI上),这使得安装MSVC相当繁琐。

所以我想知道,是否存在将foo.def文件转换为foo.lib导入库的原生MinGW方式?

(我们知道,最终,只有MSVC用户需要导入库,并且他们将随时准备好lib工具。但是,因为我们总是发送foo.lib文件,切换到foo.def会破坏第三方构建系统 - 我们希望避免这种情况。)

2 个答案:

答案 0 :(得分:0)

  

我们希望在我们的Linux系统上交叉编译整个事情

我不知道任何可移植到Linux的MS LIB克隆,但来自Pelles C发行版的POLIB免费,小巧,独立且与MS工具兼容。除了kernel32.dll之外,它没有依赖项,因此,我相信它也会在Wine下运行。

答案 1 :(得分:0)

要生成类似于Microsoft的link.exe生成的导入库,可以使用llvm-dlltool(LLVM编译器项目的一部分):

llvm-dlltool -m i386:x86-64 -d foo.def -l foo.lib

如果要创建32位库,请用i386:x86-64代替i386。有关更多详细信息,请参见对How to generate an import library (LIB-file) from a DLL?的回答。

请注意,某些MinGW项目会生成.dll.a文件(由binutils dlltool生成)。虽然可以将其重命名为.lib并用作导入库,但我发现,如果MSVC项目链接到多个.dll.a库,它将导致二进制文件损坏。因此,请改用llvm-dlltool来提高兼容性。