【问题标题】:Can Visual Studio 2019 pack the DLLs it requires in just a small .exe file?Visual Studio 2019 能否将所需的 DLL 打包在一个小的 .exe 文件中?
【发布时间】:2020-04-01 16:52:09
【问题描述】:

我使用 Visual Studio 2019 使用 C++ WinAPI 制作了一个 Windows 应用程序。 完成后,我构建了它,并用我的电脑执行。它完美地工作。 然后我发送给没有 Visual Studio 的朋友。它说它需要“msvcp140d.dll”“ucrtbased.dll”“vcruntime140_1d.dll”“vcruntime140d.dll”来打开它。

然后我在我的计算机中找到它们,将它们与我的应用程序放在同一个目录中,然后将它们发送给我的朋友。它也工作得很好。

但我的问题是“有没有办法只用 Visual Studio 2019 打包它们?”一个包含大量 DLL 的小应用程序有点奇怪。

【问题讨论】:

  • 就我而言,您关于将必要的 DLL 与应用程序放在同一文件夹中的评论解决了我的直接问题,直到我找到更好的解决方案。谢谢!

标签: c visual-studio dll software-distribution


【解决方案1】:

这并不奇怪,许多应用程序将它们的依赖项与它们的二进制文件放在一起。

如果您仍然不想提供 DLL,您可以检查用户是否在他的计算机上安装了所需的库,然后处理一个小型安装程序,它将添加缺少的库。

如果您仍想“打包”它们,您可能需要改用静态链接。看看this answer

【讨论】:

  • 您确定不能与可视化 c++ 库进行静态链接吗?其他编译器允许与其标准库进行静态链接,以创建完全独立的可执行文件,而无需任何依赖。
  • 感谢您的回答,我才意识到我的错误,已编辑。
【解决方案2】:

首先,您发送了错误的文件。 带有d 后缀的文件仅用于调试并且不得分发

您不能重新分发 Visual Studio 中包含的所有文件;您只能重新分发 Redist.txt 或在线“REDIST 列表”中指定的文件。应用程序的调试版本和各种 Visual C++ 调试 DLL 不可再分发。有关详细信息,请参阅选择部署方法。

Determining Which DLLs to Redistribute

最终的可执行文件必须在发布模式下编译并使用这些 DLL 的发布版本。不要给出调试二进制文件。由于添加了用于调试目的的逻辑,它们的速度非常慢

您实际上不需要发送 DLL,但您应该告诉用户安装相应的VC redistributable package。它是 Visual Studio 项目的 runtime (CRT),其中包含 printfmemcpy... 等功能。如果项目中不使用任何DLL,则无需查找任何其他DLL

也可以通过changing the option /MD to /MT 静态链接运行时库。这样,最终的 exe 文件将是独立的(不需要额外的运行时 DLL),但它也会更大,并且当更新包以修复错误或性能问题时,您将无法使用较新的库函数。同样,无论您是静态链接还是动态链接,都必须在发布模式下编译

另见

【讨论】:

  • 感谢您的回复!我用谷歌搜索了您提到的选项“/ MD”并成功解决了这个问题!现在我的朋友不用安装很多奇怪的东西就可以打开这个应用程序了!
  • 请注意,如果您的朋友使用其他使用 MSVC 构建的应用程序,则仍然需要安装 VC redist,因此最好只安装它以在应用程序之间共享。无论您选择什么选项,在构建用于分发的二进制文件之前将项目更改为发布,不要将其留在调试中
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多