dll - 当提供程序仅附带 xxx.lib 并且您使用的是 MinGW-w64 而不是 MSVC 时,如何链接到 xxx.dll?
问题描述
Firebird和Boost社区仅为其预构建的xxx.dll二进制文件提供xxx.lib,
我正在使用MinGW-w64 v7.0.0和GCC 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!? ”
- Msys2是一个基于补丁的软件,我见过很多像libcurl这样的库仍然不是纯静态的(静态版本,.a不是.dll.a)仍然依赖于一个或多个外部.dll(不是系统的)。
- Msys2是基于Dwarf2的异常处理,我使用的是sjlj。
- Msys2使用最新的工具链v9.2.0和winpthreads、libwinpthread和zstd等库, Windows XP不再支持(Windows XP!?是的,我的更多客户仍在使用它),所以我必须降级工具链。
那么,我有什么选择,在这里链接?
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.def
并foo.dll
生成libfoo.a
. 请记住导出库libfoo.a
名称以 GCC 开头,lib-
但在编译/链接时,链接选项应该是-lfoo
GCC 的。生成的导出库libfoo.a
仅包含从 DLL 导出的符号,不能用于静态链接。
该过程不依赖于主机是 MSYS2 还是 MinGW-w64 或任何 GNU/Linux 发行版中的交叉编译器。
进一步阅读
推荐阅读
- javascript - 用链接替换 html 中的单词,但如果搜索词冲突,则更喜欢更长的单词
- python - Transformer Decoder Only 使用什么内存?
- docker - 使用 docker compose 将本地文件夹挂载到 Windows 容器
- sql - 在sql中按天分组数据与unix时间戳
- angular - 如何映射角度表单输入以发出发布请求?
- regex - 正则表达式选择数字直到某些字符
- abp - 在 Abp.io 项目中添加 Docs Module 时出现问题
- python - 具有输出梯度的自定义 Keras 损失函数
- arrays - Using a function from a function array stored in a struct in C
- vue.js - 如何正确使用来自 Vuetify 的错误消息