应用程序无法正常启动、无法定位程序输入点 XX于动态链接库解决
环境
windows;visual studio2019;;c++开发;opencv;
问题
前言
最近在利用某红外相机做二次开发。利用厂商提供的SDk进行c++开发。
但在开发过程中,发现本地运行没问题,但是将exe移植到其他平台,会报错,出现应用程序无法正常启动、无法定位程序输入点 XX于动态链接库解决等问题,甚至出现点击exe程序时,跳出来几十个窗口 😂 😂 😂 😂 😂 😂
还发现 打包好的软件,在某些电脑上能运行,在某些电脑上不能运行。为此找了很多同学、师兄的电脑,尝试了很多方法,包括替换dll;将c盘的dll复制到exe所在目录下;怀疑VS的环境;c++的环境等等。但是仍不能解决问题。
甚至差点把某些同学的电脑干崩溃了。
尝试过的方法
安装c++的环境
一开始怀疑目标电脑上没有安装c++的环境,所以找到了对应版本的c++运行库,发现还能不解决问题
直接替换dll
根据网上查找的资料,很多都说应该是dll的版本不匹配,所以利用Dependency Walker 查找软件的依赖,但是发现都是没什么问题,但是还是将软件依赖的所以dll 复制到exe所在的目录,但是还是发现部分电脑不能运行,甚至某些电脑弹出来几十个弹窗 😂 😂 😂 😂 😂 😂。(某同学的电脑差点被我干崩了)
静态链接
在网上搜索解决方案,比如 :VS2019 生成的exe文件在其他环境下运行失败的问题等。他们给出的方案是静态链接。
例如:
这通常是由于我们的IDE选择了动态编译所致。该方法生成的可执行文件比较轻省,需要的一些东西要从计算机中存在的dll库,如果运行的计算机中不存在所需的库,就会出现如上的情况。解决的方法是在VS2019中打开项目 改成 ** 动态编译生程程序**
debug与release的修改
部分解决方案 给出的方案是将debug更改为release。但是这其实与上面的静态链接没什么区别。而且还是不能解决问题。
将程序打包生成安装文件
这样的话,其实能解决很多问题,程序所依赖的dll基本上都会被链接进去,不用考虑环境的问题。
但是打包生成安装程序后,还是不能解决问题,会出现部分的电脑正常运行,部分电脑能运行的问题。
解决方法
通过查找资料,很多都提到了一个核心的问题,就是dll的版本不匹配的问题。但是上面的很多方法都都忽略了一个系统的dll的版本问题。如果将开发所使用的电脑c盘windows、system32下面的dll复制到exe所在的目录, 再移植到其他电脑,会出现dll版本与系统本身不匹配。
😊 😊 😊😊 😊 😊 😊 😊 😊 😊 😊 😊
最后经过某大佬的提醒,会不会是windows系统的版本不一样,这才恍然大悟,发现是visual studio 所使用的windows系统的SDK版本太高了,导致只有新版本的系统才能正常运行
具体解决步骤
1、右击项目
2、选择属性
3、 找到常规 、windows SDK ,选择合适的版本,注意不要太高,系统都是向下兼容,所以老版本的sdk大部分电脑能运行
4、右击项目,选择重新生成解决方案
5、右击 打包的setup项目,选择重新生成解决方案
6、 由于打包后的软件不会将自己一些自己开发的第三方库包含进去,所以将项目包含的一些第三方库 复制到程序安装的目录下
6.1 找到项目所需要的dll,如下图是需要的一些第三方dll,(注意在VC++牡蛎里面包含库的路径)
6.2 找到所需要的dll,如下图是编译好的第三方dll(厂家提供的SDK)需要的dll
如果所需要安装的电脑没有安装Visual studio 软件,即没有相应的运行库的话,则需要将在c盘 windows\system32 下面找到ms的动态库: VCRUNTIME140D.dll;MSVCP140D.dll;VCRUNTIME140 1D.dll;ucrtbased.dll(应该是四个,如果程序还显示缺少其他的dll,则也需要将其复制到安装目录下)
如果没有安装对应版本的VS,即系统里面没有 VCRUNTIME140D.d;MSVCP140D.dll;VCRUNTIME140_1D.d;ucrtbased.dll(不区分大小写,在c盘下面应该都是小写字母,如msvcp140d),则会显示如下的错误
如果不包含第三方库,如本项目所使用的 libirtemp.dll等动态库则会显示如下的错误
6.3 将该所有的dll打包,和打包生成安装文件放在一起,如图
6.4 将其打包成压缩包,发给目标电脑
6.5 在目标电脑上点击setup.exe,按照引导程序,安装程序
6.6 将上图dll文件夹下面所有的dll文件复制到安装目录下
上述加dll的步骤,是因为本人一开始使用动态链接,如果采用静态链接,则不需要这么麻烦,直接将VS生成的setup.exe发给目标电脑,直接安装即可运行
😊
上述加dll的步骤,是因为本人一开始使用动态链接,如果采用静态链接,则不需要这么麻烦。不需要将VCRUNTIME140D.d;MSVCP140D.dll;VCRUNTIME140_1D.d;ucrtbased.dll等复制到安装目录,但是 第三方的dll仍需添加(试过静态链接)。将VS生成的setup.exe发给目标电脑,直接安装即可运行
注意事项
在安装程序的时候,最好不要拿其他人的电脑直接试,因为如果程序存在问题,电脑崩了就寄了。比如我,拿师兄、同学的电脑试,最后差点被大家拉黑 😂。万一出现问题,重新安装各种软件,配置各种环境更令人头疼。为了安全起见,可以安装windows虚拟机,在虚拟机上试,万一崩了,删掉,重新搞一个就行。当然也可以采用服务器,因为本人电脑已经装了两个linux系统的虚拟机,导致内存紧张,所有白嫖了一个阿里云的服务器,最后才解决问题