当提供者只附带 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?
Firebird 和 Boost 社区仅提供 xxx.lib -内置 xxx.dll 二进制文件,
我正在使用 MinGW-w64 v7.0.0 和 GCC 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!?”
- Msys2是一个基于补丁的软件,我看到了很多像libcurl这样的库仍然不是纯静态的(静态版本,.a 一个不是 .dll.a 一个) 仍然依赖于一个或多个外部 。 dlls(不是系统的)。
- Msys2 是基于 Dwarf2 的异常处理,我正在使用 sjlj 之一。
- Msys2 使用最新的工具链 v9.2.0 和 winpthreads 等库, libwinpthread 和 zstd 在 Windows 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.def
和 foo.dll
并生成 libfoo.a
。记住
导出库 libfoo.a
名称以 lib-
开头,但在
compiling/linking 如果是 GCC,链接选项应该是 -lfoo
。
生成的导出库 libfoo.a
只包含是的符号
从DLL导出,不能用于静态链接。
程序不依赖于主机是MSYS2还是MinGW-w64还是cross
任何 GNU/Linux 发行版中的编译器。
进一步阅读
Firebird 和 Boost 社区仅提供 xxx.lib -内置 xxx.dll 二进制文件,
我正在使用 MinGW-w64 v7.0.0 和 GCC 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!?”
- Msys2是一个基于补丁的软件,我看到了很多像libcurl这样的库仍然不是纯静态的(静态版本,.a 一个不是 .dll.a 一个) 仍然依赖于一个或多个外部 。 dlls(不是系统的)。
- Msys2 是基于 Dwarf2 的异常处理,我正在使用 sjlj 之一。
- Msys2 使用最新的工具链 v9.2.0 和 winpthreads 等库, libwinpthread 和 zstd 在 Windows 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.def
和 foo.dll
并生成 libfoo.a
。记住
导出库 libfoo.a
名称以 lib-
开头,但在
compiling/linking 如果是 GCC,链接选项应该是 -lfoo
。
生成的导出库 libfoo.a
只包含是的符号
从DLL导出,不能用于静态链接。
程序不依赖于主机是MSYS2还是MinGW-w64还是cross 任何 GNU/Linux 发行版中的编译器。