一次so not found排查过程记录(so间接依赖)

可执行程序间接依赖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问题

一次so not found排查过程记录(so间接依赖)

上一篇:dsu on tree详解


下一篇:Centos7安装Docker