昇腾学院 | 案例分享 Atlas200程序找不到链接库问题
问题现象描述
硬件配置:Atlas 200DK
问题现象:用户在Atlas200DK上运行程序失败,log显示找不到链接库libavcodec.so。如图1所示:
图1
关键过程、根本原因分析
关键过程:
Log的错误显示,程序不能找到ffmpeg动态库中libavcodec.so.58库文件,加载失败,导致错误。首先查看客户的编译环境是否含有ffmpeg库文件,发现用户的编译环境中是含有ffmpeg库文件的。程序的编译能成功地链接上libavcodec.so,并且编译成功,生成了相应的可执行文件。
查看客户的编译配置文件CMakeLists.txt,如图2所示,客户使用的是动态链接的方式,程序运行的时候才会进行动态库的加载。找不到动态库,就表明可能用户的Atlas200DK上没有对应的库。因此查看用户Atlas200DK的环境,发现并没有相对应的库:
图2
根本原因分析:
1. 用户编译时采用的是动态链接的方式去链接需要的动态链接库,这种方式是在程序运行需要用到动态库代码时才去载入动态链接库。由于Atlas200DK的编译是在PC上进行的,该PC上已经有对应的ffmpeg动态链接库了,所以编译会成功。但是程序运行是在Atlas200DK上运行的,运行时还需动态载入链接库。因此还需要在Atlas200DK上找到对应的链接库,即要将链接库放置在Atlas200DK上。
结论、解决方案及效果
解决方案:
1、将对应的ffmpeg动态链接库发送至Atlas200DK上。
2、可以用3种方法解决这个动态链接问题:
(1)用ln命令将需要的so文件链接到/usr/lib64文件夹下,命令如下:
ln –s /where/your/lib/*.so /usr/lib64
sudo ldconfig
(2)修改LD_LIBRARY_PATH,命令如下:
export LD_LIBRARY_PATH=/where/your/lib:$LD_LIBRARY_PATH
sudo ldconfig
(3)修改/etc/ld.so.conf,命令如下:
vim /etc/ld.so.conf
将动态链接库的路径添加在这个文件的最后。
sudo ldconfig
经验总结、预防措施和规范建议
动态链接是在程序运行时才进行链接,而静态链接则是在编译的时候就将静态库与应用程序编译在一起。因此要注意编译时候的链接方式,如果是动态链接,那么需要注意在运行环境下是否有对应的动态链接库,并确保能正确链接上去。
- 点赞
- 收藏
- 关注作者
评论(0)