当提供者只附带 xxx.lib 并且您使用的是 MinGW-w64 而不是 MSVC 时,如何将 link 转换为 xxx.dll?

How to link to an xxx.dll when the provider only ships it with an xxx.lib and you are using MinGW-w64 and not MSVC?

FirebirdBoost 社区仅提供 xxx.lib -内置 xxx.dll 二进制文件,

我正在使用 MinGW-w64 v7.0.0GCC v8.1.0,

最后一个需要一个 libxxx.a 文件,其中包含所有 xxx.dll 函数符号 link 与.

对于 Boost,我可以从 MinGW-w64 的源代码构建它(尽管我仍然更喜欢使用预构建的一个,因为像这样的大型工具包的构建过程需要很长时间)。

至于 Firebird,它根本无法使用 MinGW-w64 构建,除非打了补丁,我不能保证修补后的源文件将产生一个安全的 fbclient.dll 用于生产。

而且我听说 MinGW-w64 的较新版本接受 direct linking 到 [=33= .dll,

这是真的吗?它只是 MinGW-w64 .dlls,只有 C .dlls 还是包括 C++,或任何类型的 .dll,包括 MSVC

您可能会说:“为什么我不直接使用 Msys2!?

  1. Ms​​ys2是一个基于补丁的软件,我看到了很多像libcurl这样的库仍然不是纯静态的(静态版本,.a 一个不是 .dll.a 一个) 仍然依赖于一个或多个外部 。 dlls(不是系统的)。
  2. Ms​​ys2 是基于 Dwarf2 的异常处理,我正在使用 sjlj 之一。
  3. Ms​​ys2 使用最新的工具链 v9.2.0winpthreads 等库, libwinpthreadzstdWindows XP 中不再支持 (Windows XP!? YES,我的更多客户仍在使用它),所以我必须降级工具链。

那么,link我有什么选择?

TIA。

Windows DLL 不能与可执行程序链接。对于链接,我们有 为 mingw-w64 创建导出库。这个答案假设你已经 在您的开发环境中安装 mingw-w64 并且 mingw-w64 工具是 可在命令行中访问。

可以从 DLL 或 LIB 文件创建导出库。这里的程序是 紧随其后的是 DLL 文件。打开命令提示符。假设 DLL 是 foo.dll.

  • 使用 gendef 生成导出定义文件:
gendef.exe foo.dll

此命令接受 foo.dll 并生成 foo.def

  • 生成导出库 dlltool:
dlltool.exe --dllname foo.dll --input-def foo.def --output-lib libfoo.a

此命令接受 foo.deffoo.dll 并生成 libfoo.a。记住 导出库 libfoo.a 名称以 lib- 开头,但在 compiling/linking 如果是 GCC,链接选项应该是 -lfoo。 生成的导出库 libfoo.a 只包含是的符号 从DLL导出,不能用于静态链接。

程序不依赖于主机是MSYS2还是MinGW-w64还是cross 任何 GNU/Linux 发行版中的编译器。

进一步阅读