参考网上的教程安装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