昇腾学院 | 案例分享 Atlas200程序找不到链接库问题

举报
xiongoal 发表于 2020/03/30 16:08:09 2020/03/30
【摘要】 问题现象描述硬件配置:Atlas 200DK问题现象:用户在Atlas200DK上运行程序失败,log显示找不到链接库libavcodec.so。如图1所示:图1 关键过程、根本原因分析关键过程:Log的错误显示,程序不能找到ffmpeg动态库中libavcodec.so.58库文件,加载失败,导致错误。首先查看客户的编译环境是否含有ffmpeg库文件,发现用户的编译环境中是含有ffmpeg...

问题现象描述

硬件配置:Atlas 200DK

问题现象:用户在Atlas200DK上运行程序失败,log显示找不到链接库libavcodec.so。如图1所示:

1

1.png

关键过程、根本原因分析

关键过程:

  1. Log的错误显示,程序不能找到ffmpeg动态库中libavcodec.so.58库文件,加载失败,导致错误。首先查看客户的编译环境是否含有ffmpeg库文件,发现用户的编译环境中是含有ffmpeg库文件的。程序的编译能成功地链接上libavcodec.so,并且编译成功,生成了相应的可执行文件。

  2. 查看客户的编译配置文件CMakeLists.txt,如图2所示,客户使用的是动态链接的方式,程序运行的时候才会进行动态库的加载。找不到动态库,就表明可能用户的Atlas200DK上没有对应的库。因此查看用户Atlas200DK的环境,发现并没有相对应的库:

2

2.png

根本原因分析:

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

经验总结、预防措施和规范建议

动态链接是在程序运行时才进行链接,而静态链接则是在编译的时候就将静态库与应用程序编译在一起。因此要注意编译时候的链接方式,如果是动态链接,那么需要注意在运行环境下是否有对应的动态链接库,并确保能正确链接上去。

 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。