【问题标题】:create MSVC import library with MinGW tools使用 MinGW 工具创建 MSVC 导入库
【发布时间】:2017-11-28 22:08:03
【问题描述】:

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

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

现在,按照the documentation,创建一个包含导入库所需的所有信息的 .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 会破坏第 3 方构建系统——这是我们希望避免的)。

【问题讨论】:

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


    【解决方案1】:

    要生成类似于 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 来提高兼容性。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        相关资源
        最近更新 更多