• ubuntu 安装dlib 出现dlib.so: undefined symbol: png_set_longjmp_fn


    参考网上的教程安装dlib

    安装教程1 
    sudo apt-get install libboost-python-dev cmake sudo pip install dlib
    安装教程2
    ubuntu下的安装

      进入官网下载安装包,解压

     安装编译所需工具

     sudo apt-get install cmake
     sudo apt-get install libboost-python-dev

    进入dlib的目录 
    sudo python setup.py install
    出现下面的错误
    $ python Python
    2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import dlib Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: ./dlib.so: undefined symbol: png_set_longjmp_fn >>>

    问题原因

    这个是在Linux上编译项目的时候,一个动态库层用到的一个函数实现未找到,,

    系统安装了libpng16.so.16.29.0*, readelf -s了下这个文件,是有png_set_longjmp_fn这个符号的

    lrwxrwxrwx  1 root root         19 6月   1 10:49 libpng16.so -> libpng16.so.16.29.0*
    lrwxrwxrwx  1 root root         19 6月   1 10:49 libpng16.so.16 -> libpng16.so.16.29.0*
    -rwxr-xr-x  1 root root     926416 6月   1 10:49 libpng16.so.16.29.0*

    查找原因发现:

    系统中还有一个位置安装了旧版本的libpng12,

    /lib/x86_64-linux-gnu

    -rwxrwxrwx 1 root root 149800 10月 19 19:21 libpng12.so.0*
    -rwxrwxrwx 1 root root 149800 10月 19 19:21 libpng12.so.0.54.0*

    该版本中的libpng中是没有png_set_longjmp_fn的函数定义的,编译相关的库 dlib 依赖的时候,

    首先是链接到/lib/x86_64-linux-gnu/libpng12.so.0找不到该函数,报错。

    解决方法1:(推荐)

    cd /lib/x86_64-linux-gnu

    sudo rm libpng12.so.0  (这里删除老版本的libpng库)

    sudo rm libpng12.so.0.54.0

    sudo ln -s /usr/local/lib/libpng16.so.16 ./libpng16.so.16 (建立一个链接,指向libpng16)

    这样系统编译的时候,链接到/usr/local/lib/libpng16.so.16的库中

    解决方法2:

    png使用过程问题小结:

    (1) libpng “png_set_longjmp_fn” not found

    解决思路

    In my case, I have the old png 1.2 came with my ubuntu installed in /usr. I installed the 1.6.x in /usr/local. In my make system, the default include /usr/include and linking /usr/lib were picked up. When compiling any software that rely on the new interface, you need to add

    CPPFLAGS="-I/usr/local/include $CPPFLAGS"
    LDFLAGS="-L/usr/local/lib $LDFLAGS"

    this will pick up

    grep png_set_longjmp_fn png.h
    PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr,
          (*png_set_longjmp_fn((png_ptr), longjmp, (sizeof (jmp_buf))))

    翻译过来就是:编译程序时,在makefile 中 加入

    CPPFLAGS="-I/usr/local/include $CPPFLAGS"
    LDFLAGS="-L/usr/local/lib $LDFLAGS"
    使得所依赖的libpng库都指向自己安装的最新libpng16

     
  • 相关阅读:
    Dart语言学习笔记(5)
    使用 Dart 调用 REST API
    JSON数据的解析和生成(Dart)
    趣味编程:静夜思(Dart版)
    正则表达式(Dart)
    Dart语言学习笔记(4)
    Dart语言学习笔记(3)
    C++11特性之右值引用
    各大编程字体比较
    优先队列的应用 C++实现
  • 原文地址:https://www.cnblogs.com/adong7639/p/7694755.html
Copyright © 2020-2023  润新知