gpt4 book ai didi

windows - C : Correct Way to Statically/Dynamically Link with MinGW-w64

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

直观地:

  • MinGW-w64 是 GNU 编译器工具(GCC 等)的 Windows 端口。
  • 适用于 Windows 的预编译二进制文件是 .dll(动态链接)/.lib(静态链接)。
  • 但是,MinGW-w64 使用 GNU 编译器工具,因此需要 .so/.a 二进制文件。

我发现了什么:

不幸的是,我无法从 MinGW 和 MinGW-w64 中找到明确的文档来说明在动态/静态链接库时什么是对的,什么是错的。

根据我的经验,我总是能够动态链接到 .dll。曾经,我能够静态链接到 .lib(使用 -static 标志)。

问题:

在使用 MinGW-w64 GCC 工具链编译时,.dll/.a 二进制文件是否适合动态和静态链接库?也就是说,为MSVC生成动态库,为GCC生成静态库?

最佳答案

答案:

MinGW/MinGW-w64 的端口 GCC's linker ld can :

  • 直接链接到.dll进行动态链接
  • 间接链接到.dll.a进行动态链接(在编译时使用导入库)
  • 链接到 .a 进行静态链接。

为什么 GCC 链接器的 MinGW/MinGW-w64 端口会寻找 .dll

简而言之,最佳答案是因为 .dll 是 Microsoft 对其 32 位和 64 位操作系统上的共享对象的答案。在 Windows 上,MinGW/MinGW-w64 的端口使用 Microsoft C 运行时 (msvcrt.dll) [1] , 因此它遵守 Windows 操作系统链接器规则。

Dynamic-link library (or DLL) is Microsoft's implementation of the shared library concept in the Microsoft Windows and OS/2 operating systems. -- From Wikipedia

因此,要动态链接库,您将使用文件扩展名:

  1. .so 用于 Linux 上的共享库,因为这是 GCC binutils 的链接器搜索的内容,
  2. .dll 用于 Windows 上的共享库,因为这是 GCC binutils 链接器搜索的 MinGW/MinGW-w64 端口。

GCC 的 MinGW 端口用于共享库对象的扩展在源代码的 cygming 文件中明确列出。正如@ChronoKitsune 评论的那样,具体来说:SHLIB_EXT = .dll in libgcc/config/i386/t-slibgcc-cygming . cygming 文件(用于 Cygwin 和 MinGW)对于 MinGW、MinGW-w64 以及 32 位和 64 位版本的 Cygwin 都是通用的。因此,这适用于 GCC binutils 到 Windows 的所有端口。

为什么 MinGW/MinGW-w64 链接器会处理 .lib

原则上,GCC binutils 的链接器不会将 .lib 识别为静态库。但是,链接器可能足够聪明,可以链接到 .lib 导入的 .dll(在 .lib 实际上是一个导入库)。例如,在库具有动态链接的依赖项的情况下,该库将被动态链接(和 flags to "force" static linking will be ignored )。

在这种情况下,我认为链接器不会抛出任何错误,并且看起来好像 .lib 实际上已成功链接。

导入库如何工作? (免费赠品)

在 Windows 上,.lib 可以是以下两个库之一:

  1. 编译器从 .dll 生成的导入 库,其中包含编译期间符号解析所需的所有定义(但是,函数实现被排除在外)[2]
    1. 如果您尝试使用 MinGW/MinGW-w64 的 GCC binutils 端口为 xxxx.dll 生成导入库,它将生成 libxxxx.dll.a。扩展文件扩展名可用于区分导入 库和完全定义的静态 库。使用 MSVC 编译时,此 distinction isn't apparent in the extension
  2. 一个完全定义的静态库

.lib 有双重用途,因为正如@ChronoKitsune 评论的那样,MSVC 链接器不直接链接到 .dll。相反,需要一个导入库来在编译时解析符号定义,这样 .dll 直到运行时才加载:

An import library (.LIB files) to link with. (The linker creates the import library when the DLL is built.) -- VS 2015 Documentation

为什么 GCC 链接器的 MinGW/MinGW-w64 端口会寻找 .a

这很简单——端口使用了在 *-nix 系统上使用的 ar 归档实用程序,正如@ChronoKitsune 评论的那样:

The extension for static libraries comes from the ar (archive) program included with binutils. You can use ar -t libxxx.a to list the object files contained within any static library.

这类似于 MSVC 的 lib 命令,lib/list foo.lib 此命令将返回 .obj 文件的列表如果 .lib 是静态库,则在里面。

关于windows - C : Correct Way to Statically/Dynamically Link with MinGW-w64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43311621/

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