Windows下应用程序发布的库依赖问题解决方法

Windows下开发程序难免会用到动态链接库,然而库依赖在发布时非常容易导致应用程序无法正常启动,常见情况有以下几种:

一、 无法启用该程序,因为计算机中丢失xx.dll。尝试重新安装该程序以解决此问题。

VS自带有一个dumpbin工具,在要发布应用程序之前,可以使用dumpbin /dependents xx.exe来查看库依赖情况:


Windows下应用程序发布的库依赖问题解决方法_第1张图片
dumpbin查看依赖

由此我们可以把依赖的动态库均打包一份防止缺少dll的问题发生,但是要尤其注意dll的版本问题,否则会导致问题二的发生。

二、应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。

上面说到该问题发生的原因在于应用程序依赖的当前环境下dll版本不对,根本上的解决方案就是在打包时就做好版本一致的检查。

  • 对于Qt应用,Qt提供了windeployqt工具,使用windeployqt xx.exe即可在当前目录下打包所有Qt依赖库(仅打包Qt库);


    Windows下应用程序发布的库依赖问题解决方法_第2张图片
    windeployqt打包Qt程序
  • 对于VS依赖库,在VS的安装目录下你可以找到所需动态库的x64和x86版本,如:
    Windows下应用程序发布的库依赖问题解决方法_第3张图片
    redist中的不同版本依赖库
Windows下应用程序发布的库依赖问题解决方法_第4张图片
这里就是前面看到的那些api-xxxx.dll的不同版本啦
  • 此外,对于VS的库依赖问题还可以采用另外一种方法,把与开发版本对应的VS运行环境安装程序在目标环境安装一遍也能解决。这里是VS2015版本x64与x86的vc_redist下载链接Visual C++ Redistributable for Visual Studio 2015。

三、无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll

这个是后来遇到的情况,其实原因与问题二相同,只是库之间的依赖传递不太容易发现,出现这个提示说明当前环境下的ucrtbase.dll是不兼容的,也就是版本不对,需要把开发环境下的ucrtbase.dll打包进去或者安装VS运行环境。
嗯还是用后者来的方便,一步到位,再加上Qt自带打包工具,Visual Studio和Qt的库依赖问题就基本解决了。


还有一点值得一提,因为有些系统级的动态库在不同版本OS下虽然名字相同但实现和依赖差别很大,如ws2_32.dll,因此在部署环境下不要随便使用开发环境的版本。

你可能感兴趣的:(Windows下应用程序发布的库依赖问题解决方法)