[记录一个bug]av_hwdevice_ctx_create出现Cannot allocate memory(附带库运行时路径)[已解决]

7 篇文章 2 订阅

新写的程序里调用ffmpeg的av_hwdevice_ctx_create()这个函数,出现Cannot allocate memory。但是另个程序一样的代码,居然是成功的。

反复检查之后无果,就跳出去查了一下,看到一个问答:

Have you tried to use ffmpg executables with the same libs that you using when you run the app?

Have you tried to use ffmpg executables with the same libs

use ffmpg executables with the same libs

executables with the same libs

with the same libs

same libs!!!!!

启发到我可能是库连接不对,链接的是不同的库导致这个问题,的确一个是指定lib路径,一个是用默认路径。

修改完之后的确成功了!!!!

所以,打算趁此机会了解一下库运行时找库的优先级。

 

众所周知,Linux链接库分为编译时 、运行时,也不会像windows一样在同目录找库。

编译时:(优先级排序)

(1)-L指定的目录;

(2)环境变量LIBRARY_PATH指定的目录;

(3)/lib /usr/lib usr/local/lib 目录;

也就是说-L指定的目录是优先使用的,即便系统目录中含有同名so库,也没有关系。可以在编译命令中加上--verbose查看链接详情信息,会列出来collect2所使用的所有-L目录。对编译链接出来的ELF文件,可以采用ldd工具查看依赖的so情况。

 

运行时:(优先级排序)

(1)编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R)

example: gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c

(2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

example: export LD_LIBRARY_PATH=/root/test/env/lib:$LD_LIBRARY_PATH

(3)配置文件/etc/ld.so.conf中指定的动态库搜索路径;(更改/etc/ld.so.conf文件后记得一定要执行命令:ldconfig!该命令会将/etc/ld.so.conf文件中所有路径下的库载入内存中)

(4)默认的动态库搜索路径/lib;

(5)默认的动态库搜索路径/usr/lib。

 

敲黑板总结一下:

1. 编译时查找的是静态库或动态库,而运行时,查找的只是动态库。

2. 编译时可以用-L指定查找路径,或者用环境变量LIBRARY_PATH,而运行时可以用-Wl,rpath或-R选项,或者修改/etc/ld.so.conf文件或者设置环境变量LD_LIBRARY_PATH.

3. 编译时用的链接器是ld,而运行时用的链接器是/lib/ld-linux.so.2.

4. 编译时与运行时都会查找默认路径:/lib  /usr/lib

5. 编译时还有一个默认路径:/usr/local/lib,而运行时不会默认找查该路径。

 

有不对的地方请指教,欢迎下次光临~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值