问题(一)
问题描述:无法定位程序输入点SDL_CreateRenderer于动态链接库avdevice-57.dill。开发过程中需要用到SDL的库,搭建好SDL的开发环境后,代码编译没有问题,执行的时候提示错误,程序异常结束。
问题分析1:根据提示的错误,猜测可能是程序没有找到对应的dill文件,或者是dill文件的版本不对,于是把dill文件放在可执行文件的目录下,仍然没有解决。
问题分析2:接下来就是怀疑dill的版本不对,但是和之前SDL的例子对比了下,版本一模一样,之前的SDL的例子运行就没问题,那说明这个dill文件没问题。
问题分析3:难道程序运行的时候找到的dill不是我这个dill?我电脑里还有相同文件名的dill?于是全局搜索了下我的电脑结果如下图:
果然,电脑里有好多同名dill,那程序在执行时到底找到的是哪个dill文件?网上搜索了下dill目录查找顺序,如下:
可以总结一下查找顺序:
1.可执行文件所在目录;
2.进程当前目录;
3.系统目录,%SystemRoot%/system32
4.16位系统目录;,%SystemRoot%/system
5.Windows目录,%SystemRoot%/
6.环境变量PATH中的目录;
所以程序执行时优先查找可执行文件所在目录下的dill,那没错呀。
问题分析4:最后实在没办法了,仔细品味提示的错误语句,“无法定位程序输入点SDL_CreateRenderer于动态链接库avdevice-57.dill”,发现了和avdevice-57.dill有关,这个dill不是ffmpeg的动态库么,SDL怎么和ffmpeg的库扯上关系?难道ffmpeg库的存在使得SDL库调用不正确?于是我把ffmpeg的avdevice库先去掉,果然好用,问题解决了,但是ffmpeg的库我得用啊,要么在pro文件把SDL的库放前面,ffmpeg库放后面?这样在找SDL库的时候就不会有ffmpeg库干扰,试了下果然成功了。
解决方法:在pro文件把SDL的库放前面,ffmpeg库放后面。问题解决了,但是真正的原因没有找到,为什么ffmpeg库会影响SDL库?(我活着影响你输出了??)知道的朋友还请指教。
总结:多个外部库共存的情况下需要注意外部库引用的顺序问题,另外,出问题多看出错提示