gpt4 book ai didi

windows - libfoo.a 和 foo.lib 是兼容格式吗?

转载 作者:可可西里 更新时间:2023-11-01 14:14:14 25 4
gpt4 key购买 nike

一些构建脚本(例如 numpy 中的脚本)只需执行以下操作即可使 gcc 编译的库存档与 Visual Studio 链接器一起工作:

copy libfoo.a foo.lib

令人惊讶的是它似乎有效。有谁知道为什么吗?

最佳答案

取决于几个因素,它可能会或可能不会工作 - 并且有几个原因。我认为你的意思是完全的、可逆的兼容性。

  1. 对于用于将 DLL 绑定(bind)到可执行文件的 implib,答案是

    我曾经尝试将 MSVC++ implib 与 gcc 生成的 dll 链接起来。如果格式兼容的,那么当我重命名库 libfoo.a 时它会起作用。为了解决这个问题,有一个名为 reimp 的实用程序可以从 DLL 生成合适的 gcc implib。为了逆转这个过程,微软的 lib 工具可以从 .def 文件创建一个静态 implib,如果给它正确的标志,gcc 可以用 DLL 生成它。 [在 mingw 网站上搜索“reimp”以获取更多信息]
  2. C++ 编译的目标文件也不兼容,因为 Name Mangling .

    不同的 C++ 编译器以不同方式处理变量和对象名称,导致“[对象] 代码……通常不可链接”
  3. 对于编译为普通旧 C 的静态库?

    我需要更多关于您关注的项目类型的信息,但如果它是 C 并且 `copy libfoo.a foo.lib` hack 有效,则可能是这种情况。尝试查看这是否适用于 Mingw 或 Dev-C++。 编辑:实际上,这仅在库在 Windows 平台上使用 gcc 编译时才有效(并且它可以双向工作!)。这个 AFAIK 的唯一异常(exception)是交叉编译的库——MSVC 拒绝接受它们,至少 Ubuntu 提供的“i586-mingw32msvc-ar”是这样。

另一种解释是,由于历史原因,MSVC 链接器与 .a 格式兼容。 IIRC,它从 UNIX 时代就存在了。同样,尽管我只能看到这适用于纯 C,而不适用于 C++。
编辑:实际上是相反的。 Windows 版本的 GCC 工具包创建与 Microsoft 的 COFF 格式兼容的静态库。

关于windows - libfoo.a 和 foo.lib 是兼容格式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com