今天出现了C程序在本地VS上面运行正常,生成的exe文件在本地使用命令行调用也正常,但是放到服务器使用命令行调用上就出现“the application was unable to start correctly(0x000007b)”的问题,如图:
下面记录解决问题的过程:
1.使用分析工具(Dependency Walker)分析dll依赖问题
这个软件可以分析exe、dll的依赖项,用来查找调用了哪些依赖和缺少哪些依赖,官网下载。
**使用方法:**将exe、dll拖到Dependency Walker程序窗口即可。
缺失的dll会以黄色问号显示,可以根据这里缺失的DLL名称来在网上查找解决方案,本次问题的解决就是查了缺失VCRUNTIME140.DLL这个动态链接库才查询到问题所在的。
也可以根据底下的信息查找解决方法:
2.查找解决问题的方法
通过查询VCRUNTIME140.DLL,看到别人的一些解决方法:
C++2015卸载重装一遍 或者下一个directX增强版把vc运行库检查一遍
https://tieba.baidu.com/p/5370368791?red_tag=1965842565
这样我们就知道这应该是vc的运行库依赖有缺失,接着查找,最后解决方法如下:
VS静态编译C/C++解决程序丢失 VCRUNTIME140.dll
https://jingyan.baidu.com/article/a681b0de7a173c3b1843462b.html
方法:在项目上右键进入属性页面,将运行库改为 多线程(/MT) 即可,如①处。
注意:②处需要对应,如果你配制的属性页是Debug模式的,但是生成的是Release模式的,那么你会发现配制根本不生效。
之后再进行项目的生成,此次的问题就解决了。
附加:
1.Dependency Walker使用&注意
如何正确查看dll依赖,并查找问题:
对于系统的DLL可以不用展开看,但是用户自己的DLL一定要展开,看看它里面还调用了哪些DLL,因为如果这个DLL缺少依赖的DLL势必影响到我们的程序的运行。如何防范生成的软件dll依赖缺失问题:
严格的讲,在我们发布应用程序时一定要看看程序需要哪些组件依赖的,需要的就把它带上。因为用户的电脑上是没有开发环境的,不可能有这么些特定编译器的运行库。
https://blog.csdn.net/mfcing/article/details/45933397
如上面引用的文字所说,我们如果要防范这样的问题,我们需要查看我们自己引入的DLL,例如AVCODEC-57.DLL,AVUTIL-55.DLL这些。
但是本例中并不是自己引入的DLL问题,根据前文所说,我们已经知道了是VC运行库的缺失(也就是开发环境中带的DLL),如下图:
这样我们就能想到,我们应该将开环环境中的依赖也一起打包,具体操作就是改变VS中运行库的选项。
2.使用VS编译选项“运行库”介绍:
运行库就决定了程序是动态链接还是静态链接,详细如下:
动态链接为D,静态链接为T。
两者的区别在于,静态链接将程序所依赖的运行库集成到了可执行文件中,可执行文件运行时不再需要运行库;动态链接没有把程序所依赖的运行库集成到可执行文件中,可执行文件运行时需要运行库。
在调试模式下,使用调试运行库:多线程调试(/MTd)、多线程调试DLL(/MDd)
在发布模式下,使用发布运行库:多线程(/MT)、多线程DLL(/MD)
https://blog.csdn.net/qq_33757398/article/details/82156956
本次程序是Release模式的程序,所以我选用多线程/MT,将VS开发环境中所需要的运行库打包进程序,问题得以解决。