c++ - c++ 中的 dll,WINDOWS 部署/依赖项 (mingw-w64)

标签 c++ windows dll deployment mingw

背景: 我正在为 x64 应用程序编写一个插件(基本上是一个 dll)。 更具体地说,这个 x64 WIN 应用程序带有一个“插件管理器”(一个 dll),可以加载和卸载第 3 方插件(比如我的)。 我的插件是用 C++ 编写的,我决定用 mingw-w64 编译它。作为 IDE,我选择了 Code::Blocks。 我试图避免使用 MS 工具,因为后来我需要在 Linux 和 MAC 上部署“相同”的插件(但这是另一个故事,让我们暂时关注 Windows)。

挑战: 有一个严重的问题我无法以我的知识/技能水平可靠地解决,尽管我在研究和测试的日子里确实很努力:对 WINDOWS dll 的依赖。 我必须确保此插件可以在从 7 到 10 的所有 WINDOWS 版本上运行(但是仅限 x64)。 应避免运送 MS 可再分发文件,因为在这种情况下不切实际。 显然,C 运行时库“MSVCRT.dll”的静态链接似乎既不被版权所允许,也不是一个可靠的解决方案,因为在各种 WIN 版本上有许多不同的版本。尽管 Microsoft 将其描述为“已知 dll”,但我不确定哪个版本可用以及哪个版本能够在某个 Win 版本上运行。如果某个 MSVCRT.dll 运行,它对我的​​插件是否具有足够的“功能”? (对我来说太高了)

问题: 在您的专业意见中,就 Windows dll 依赖性而言,确保我的插件在 WINDOWS 7 到 10 (x64) 上的稳定性的可靠方法是什么? 在这种依赖于部署的情况下,还有其他我应该担心的陷阱吗?

附加信息: Dependency walker_x64(多么方便的工具!)在插件的这个开发阶段向我展示了依赖:

  • KERNEL32.DLL
  • MSVCRT.DLL(这是我最担心的人)
  • PM_64.DLL(这是 x64 应用程序的插件管理器)

在我的计算机 (Windows 7 x64) 上,MSVCRT.DLL 显示版本 7.0.7601.17744,好的,有效。但是,如果客户有一台新安装的 Windows 10 机器(可用的 MS 可再发行版本不多),它能可靠地工作吗?

我知道之前已经讨论过类似的问题,尤其是关于 c 运行时库“MSVCRT.dll”的问题。然而,其中许多是在 WIN10 之前。 newlib 的想法 ( http://sourceware.org/newlib/ ) 例如,6 年前。 Mingw-w64 附带名为:libmsvcrt.a/libmsvcrtXXX.a 的文件。有什么办法吗?

我已经阅读了我能找到的所有内容,但我不得不承认,现在我的疑惑和问题多于答案... 感谢您的专业建议。谢谢。

最佳答案

您可能依赖至少以下动态库的存在和稳定性:kernel32.dllmsvcrt.dlluser32.dll , gdi32.dll。它们是系统库,在干净的操作系统安装后出现在 C:\Windows\System32\文件夹中,由 Microsoft 创建为用户 API 以与操作系统交互。 MinGW 库 libmsvcrt.a(以及非静态 MS 库)没有实际的处理代码,而只是从系统文件夹调用这些 DLL 的包装器。

关于c++ - c++ 中的 dll,WINDOWS 部署/依赖项 (mingw-w64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44986744/

相关文章:

c++ - 数组变量中有更多变量还是多一维?

c++ - 在 C++ 中将 utf8 wstring 转换为 windows 上的字符串

c++ - C++14/17 的模块提案是否可以(轻松)使用其他本地语言来生成模块?

c++ - ClickOnce:在用户机器上获取 MSVCRT C++ DLL

c++ - 在另一个 VS 项目中引用函数模板的显式实例化时出现 LNK2019 错误

c++ - 单例 : C++ shared dll

C++ 错误 : expected identifier before "(" token

c - MinGW中没有fopencookie或fmemopen吗?

c - 如何列出C中正在运行的进程?

linux - 无法从 Windows 连接到 Redis Linux 服务器