3

我们目前正在将跨平台(linux、osx、w32)项目的 W32 构建过程从 VisualStudio 切换到 mingw。

我们面临的一个问题是,我们的项目创建了一个动态库 ( foo.dll),第 3 方项目可以链接到该库。为了在 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会破坏 3rd 方构建系统 - 我们想避免)。

4

2 回答 2

1

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

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

如果您想创建 32 位库,请替换i386:x86-64i386有关更多详细信息,请参阅如何从 DLL 生成导入库(LIB 文件)?.

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

于 2018-12-18T18:29:10.190 回答
0

我们想在我们的 linux 系统上交叉编译整个东西

我不知道任何可移植到 Linux 的 MS LIB 克隆,但是POLIBPelles C发行版是免费的、小型的、独立的并且与 MS 工具兼容。它除了 kernel32.dll 之外没有其他依赖项,所以我相信它也可以在 Wine 下运行。

于 2018-01-02T16:25:23.797 回答