我们目前正在将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
会破坏第三方构建系统 - 我们希望避免这种情况。)
答案 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来提高兼容性。