在linux中.so文件为共享函数库文件,用于动态连接,相当于windows下的dll。如有编译时依赖较多的情况,很容易出现找不到.so文件的错误。
这类错误的常见提示类型:
//usr/lib/x86_64-linux-gnu/libSM.so.6: undefined reference to uuid_generate@UUID_1.0'
/usr/bin/ld: cannot find -l****
/usr/bin/ld: warning: libhdf5_hl.so.100, needed by .build_release/lib/libcaffe.so, not found (try using -rpath or -rpath-link)
这些问题都是因为找不到相应的库文件。如果尚未安装所需的包则需安装。若已安好所需的文件,只是路径不对,则可以按照如下步骤来解决。
查找依赖文件,以ros中自带的libopencv_imgcodecs3.so.3.3.1为例
ldd /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_imgcodecs3.so.3.3.1
输出:
...
libwebp.so.5 => /usr/lib/x86_64-linux-gnu/libwebp.so.5 (0x00007f81bc581000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f81bc35c000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f81bc0e7000) //libopencv_imgcodecs3出错的头文件是libtiff
libjasper.so.1 => /usr/lib/x86_64-linux-gnu/libjasper.so.1 (0x00007f81bbe92000)
libopencv_core3.so.3.3 => /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so.3.3 (0x00007f81baf58000)
...
找到依赖的文件后,下一步是要用来替换该文件的其他位置的库文件的路径,以libtiff.so为例
locate libtiff.so
输出:
/home/username/anaconda3/lib/libtiff.so
/home/username/anaconda3/lib/libtiff.so.5
/home/username/anaconda3/lib/libtiff.so.5.4.0
/home/username/anaconda3/pkgs/libtiff-4.0.10-h2733197_2/lib/libtiff.so
/home/username/anaconda3/pkgs/libtiff-4.0.10-h2733197_2/lib/libtiff.so.5
/home/username/anaconda3/pkgs/libtiff-4.0.10-h2733197_2/lib/libtiff.so.5.4.0
/usr/lib/i386-linux-gnu/libtiff.so.5
/usr/lib/i386-linux-gnu/libtiff.so.5.2.4
/usr/lib/x86_64-linux-gnu/libtiff.so
/usr/lib/x86_64-linux-gnu/libtiff.so.5
/usr/lib/x86_64-linux-gnu/libtiff.so.5.2.4
本例中可以看到要用来替换的路径为/home/username/anaconda3/lib/libtiff.so.5。有时系统中会存在多个可用项,如果不确定应该用哪个可以依次尝试,直到找到正确的文件。
选定一个路径后,可以直接复制到目标路径(一般是/usr/lib/x86_64-linux-gnu/libxxxxx.so.x),以libhdf5和libhdf5_hl为例
sudo cp -s $HOME/anaconda2/lib/libhdf5_hl.so.100.0.1 /usr/lib/libhdf5_hl.so.100
sudo cp -s $HOME/anaconda2/lib/libhdf5_hl.so.100.0.1 /usr/lib/x86_64-linux-gnu/libhdf5_hl.so.100
sudo cp -s $HOME/anaconda2/lib/libhdf5.so.101.0.0 /usr/lib/libhdf5.so.101
sudo cp -s $HOME/anaconda2/lib/libhdf5.so.101.0.0 /usr/lib/x86_64-linux-gnu/libhdf5.so.101
但更推荐的方式是建立软链接,ln命令中源文件在前,被依赖的位置在后。例如
sudo ln -sf /lib/x86_64-linux-gnu/libuuid.so.1.3.0 /usr/local/lib/libuuid.so.1
最后重新进行编译,一般都能得到解决。