使用MinGW工具创建MSVC导入库

4
我们目前正在将一个跨平台项目(linux,osx,w32)的W32构建流程从VisualStudio切换到mingw。
我们面临的问题之一是,我们的项目创建了一个动态库(foo.dll),第三方项目可以链接该库。为了在W32 / MSVC上实现这一点,需要一个导入库(foo.lib)。
现在,根据文档,很容易创建一个.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相当麻烦。
所以我想知道是否有本地MinGW的方法将foo.def文件转换为foo.lib导入库?
(我们知道最终只有MSVC用户才需要导入库,并且他们将随手准备好lib工具。但是,由于我们始终发货foo.lib文件,切换到foo.def会破坏第三方构建系统-我们希望避免这种情况)。
2个回答

1
要生成类似于Microsoft的link.exe生成的导入库,您可以使用llvm-dlltool(LLVM编译器项目的一部分):
llvm-dlltool -m i386:x86-64 -d foo.def -l foo.lib

如果您想创建一个32位库,请将i386替换为i386:x86-64。有关更多详细信息,请参见如何从DLL生成导入库(LIB文件)的答案?
请注意,一些MinGW项目会生成.dll.a文件(由binutils dlltool生成)。尽管这可以重命名为.lib并作为导入库使用,但我发现如果MSVC项目链接到多个.dll.a库,则会导致二进制文件损坏。因此,为了提高兼容性,请改用llvm-dlltool。

0
我们想在我们的Linux系统上进行整个交叉编译。
我不知道是否有任何MS LIB克隆可移植到Linux,但是Pelles C发行版中的POLIB是免费的、小巧的、自包含的,并且与MS工具兼容。它除了kernel32.dll之外没有其他依赖项,因此我相信它也可以在Wine下运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接