Linux下编译时找不到.so文件 解决方法

在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

最后重新进行编译,一般都能得到解决。

 

你可能感兴趣的:(其他,操作系统)