首页 > 解决方案 > 当提供程序仅附带 xxx.lib 并且您使用的是 MinGW-w64 而不是 MSVC 时,如何链接到 xxx.dll?

问题描述

FirebirdBoost社区仅为其预构建的xxx.dll二进制文件提供xxx.lib

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

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

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

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

而且我听说较新版本的MinGW-w64接受直接链接.dll

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

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

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

那么,我有什么选择,在这里链接?

TIA。

标签: dlllinkermingwdynamic-linkingmingw-w64

解决方案


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名称以 GCC 开头,lib-但在编译/链接时,链接选项应该是-lfooGCC 的。生成的导出库libfoo.a仅包含从 DLL 导出的符号,不能用于静态链接。

该过程不依赖于主机是 MSYS2 还是 MinGW-w64 或任何 GNU/Linux 发行版中的交叉编译器。

进一步阅读


推荐阅读