可执行程序间接依赖libfdk-aac.so.1
背景:
1. 编译ffmpeg动态库,加载第三方so动态库libfdk-aac.so.1(都是开源的,提前按照文档已编译好,机器1上)
2. cmake编译可执行程序test,使用ffmpeg so库(机器2上面,系统与1版本一样,so库全部copy过来)
3. 预先设定:将所有so依赖库全部放入tes同级目录lib目录下
通过cmake设置so运行时指定路径来解决so not found问题:
详细参考: https://www.cnblogs.com/rickyk/p/3875084.html
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "${ORIGIN}/lib")
遇到问题:
error while loading shared libraries: libfdk-aac.so.1: cannot open shared object file: No such file or directory
ldd查看依赖:
libfdk-aac.so.1 not found
通过export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH:./lib” 方式可以解决,但是不明白为什么cmake已指定,还是找不到,
同时后期通过docker发布每次执行也不是太方便
继续排查:
开始怀疑CMake设置的rpath有问题,后面各种查资料,各种修改测试,发现与cmkae无关
所有test直接依赖的so,通过cmake设置的rpath,都能找到,唯独ffmpep依赖的libfdk-aac.so.1找不到
ffmpeg编译不带aac的so,就没有问题
开始着手查ffmpeg so库,只有libavcodec.so.58.112.103依赖libfdk-aac.so.1
ldd libavcodec.so.58.112.103
libfdk-aac.so.1 => not found
明显是ffmpeg的库找不到so,而不是test经过cmake的编译问题导致
解决:
由于ffmpeg是在另外的机器编译生成,去编译机器上查看libavcodec.so.58.112.103
ldd libavcodec.so.58.112.103
libfdk-aac.so.1 => /usr/lib/x86_64-linux-gnu/libfdk-aac.so.1 (0x00007f5876af1000)
将libfdk-aac.so.1拷贝到/usr/lib/x86_64-linux-gnu/
再次ldd,依旧找不到。。。。。。一脸懵逼中。。。。。。
查看/etc/ld.so.conf,逐个将aac的so往其中都放一遍,还是not found
ldconfig 想着更新一下再试试,还是不行。。。。。。
ldconfig
/sbin/ldconfig.real: /usr/lib/x86_64-linux-gnu/libfdk-aac.so.1 not found
/sbin/ldconfig.real: Can't create temporary cache file /etc/ld.so.cache~: Permission denied
继续懵圈中。。,后面看到Permission denied,想到会不会是root权限问题
切换root执行
sudo ldd libavcodec.so.58.112.103
libfdk-aac.so.1 => /usr/lib/x86_64-linux-gnu/libfdk-aac.so.1 (0x00007f5876af1000)
然后使用sudo运行可执行程序,成功。。。。。。
更改权限
sudo chmod 777 /usr/lib/x86_64-linux-gnu/libfdk-aac.so.1
再次ldd和运行程序,都可用直接运行了。。。。。
后期制作docker,将aac这个库提前放入指定路径,docker运行就不会有问题了
总结:
1. cmake可以通过解决target依赖的so的路径问题,但是无法解决提前编译好的so的第三方依赖问题
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "${ORIGIN}/lib")
2. 第三方依赖的so,需要注意依赖的路径,可以提前放入系统路径下,同时也需要注意root和非root的ldd问题