【问题标题】:Ensure all dependency dlls are packaged into executable确保所有依赖 dll 都打包成可执行文件
【发布时间】:2016-12-25 00:38:47
【问题描述】:

我想如果您使用/MT Code Generation->Runtime library 编译 Visual-studio 2013 Win32 项目,那么它会自动将所有依赖项 dll(包括第 3 方 dll)打包到可执行文件中?

目前某些用户在运行我的 .exe 时遇到错误。它与没有第 3 方 dll(OpenSSL)有关:

程序无法启动,因为您的计算机中缺少 LIBEAY32.dll

在 Windows 10 操作系统上使用我的 .exe 的用户出现此错误。如何确保所有依赖 dll 都打包到我的 .exe 中?

我目前在我的 64 位 Windows 8.1 操作系统上编译我的应用程序。 win32 visual-studio 项目是使用以下项目属性编译的:

  • 字符集:Unicode 字符集
  • 使用 MFC:使用标准 Windows 库
  • 整个程序优化:使用链接时间码生成
  • 调试信息格式:无
  • 代码生成->运行时库:/MT

【问题讨论】:

  • 不,/MT 不会将 DLL 打包到生成的二进制文件中。

标签: c++ windows visual-studio visual-studio-2013


【解决方案1】:

/MT 表示您正在使用多线程、静态版本的运行时库。这不会影响第三方依赖,例如OpenSSL 仍然是动态链接的。

要检查您的 dll 的依赖关系,我更喜欢 Dependency Walker 工具。它会显示是否遗漏了一些依赖项。

为确保所有链接到您的 .exe 文件的依赖项对所有第三方依赖项使用静态链接,例如对于 OpenSSL,您应该使用 libeay32MT.lib 库。

【讨论】:

    【解决方案2】:

    Nikita 是对的,请使用 Dependency Walker,我要补充一点,您缺少一些关于 DLL 到底是什么的知识。无意冒犯,我知道 dll 可以是皮塔饼。 What is a DLL?

    根据定义,您的 .exe 中不包含 DLL,但它在运行时加载并且可以在多个应用程序之间共享。如果您想将它包含在您的 .exe 中,则需要一些额外的非平凡工作才能将它们嵌入到您的 exe 中,在运行时解包和加载。 见this post

    我建议改用安装程序,更容易处理!只需创建一个安装程序(您知道单击单击“是-是-我同意-确定-完成”向导安装程序),其中将包含您的 .exe 和所有需要的依赖文件。作为参考Inno setup 非常棒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2015-05-24
      • 1970-01-01
      相关资源
      最近更新 更多