zoukankan      html  css  js  c++  java
  • 一次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问题

  • 相关阅读:
    rabbitmq的安装和使用
    springboot之rabbitmq
    springboot之assembly的文件配置
    Android -- 真正的 高仿微信 打开网页的进度条效果
    香蕉云APP,2016下半年开发日记
    使用 Android Studio 检测内存泄漏与解决内存泄漏问题
    阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用
    PHP 获取 特定时间范围 类
    真实记录疑似Linux病毒导致服务器 带宽跑满的解决过程
    -Android -线程池 批量上传图片 -附php接收代码
  • 原文地址:https://www.cnblogs.com/leehm/p/14953912.html
Copyright © 2011-2022 走看看