新写的程序里调用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,而运行时不会默认找查该路径。
有不对的地方请指教,欢迎下次光临~