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

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

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个问题通常是由于没有将头文件的路径添加到编译器的搜索路径中造成的。 解决方法有两种: 1.使用 -I 选项将头文件目录添加到编译器的搜索路径中。例如:gcc -I /usr/include/mylib myprogram.c -o myprogram 2.在系统的环境变量中配置头文件目录,例如在Linux中,可以在/etc/ld.so.conf 中添加头文件目录,然后运行ldconfig。 ### 回答2: Linux是一种广泛使用的操作系统,由于其开放源代码和免费使用的特点,被越来越多的开发者和用户所使用。而在开发Linux应用程序,有会遇到不到文件的问题。以下将从原因和解决方案两个方面进行分析。 1. 原因 在使用Linux平台编译C/C++程序,需要引用系统头文件。这些头文件一般位于/usr/include或者/usr/local/include目录下。如果编译不到这些头文件,就会出现不到文件的错误。常见的原因如下: (1)头文件路径不正确:在编写代码没有将系统头文件路径添加到编译器的参数中。 (2)缺少相关依赖库:有些头文件是依赖于相关的库文件的,如果没有该库文件,头文件就会无法正常引用,从而导致不到文件的错误。 (3)权限问题:有些头文件可能需要root权限才能操作,如果当前用户没有权限,就会出现不到文件的问题。 2. 解决方案 (1)检查头文件路径:通常情况下,可以将系统头文件路径添加到编译器的参数中,例如: gcc -I /usr/include hello.c 如果头文件在其他路径下,需要将路径加入-I参数中。 (2)安装依赖库:如果头文件引用了相关的库文件,可以通过安装该库文件解决问题。例如,如果需要使用sqlite3库, 可以使用如下命令安装: sudo apt-get install libsqlite3-dev (3)更改权限:如果出现权限问题,可以使用chmod命令更改文件权限。例如: chmod 644 /usr/include/stdio.h 以上就是针对Linux编译不到文件的原因和解决办法的介绍。在开发过程中,遇到问题需要认真排查并掌握解决方法,以提高开发效率和代码质量。 ### 回答3: 在Linux编译过程中经常会遇到不到文件的问题,这通常是由于编译环境没有正确配置所引起的。下面我将介绍三种可能性和对应的解决方法。 1. 头文件不在标准路径中 在Linux中,头文件通常保存在/usr/include目录下或者在用户自定义的路径中,如果编译不到文件,可能是因为头文件路径没有正确配置。 解决方法: 可以尝试将头文件拷贝到标准路径中,或者使用-I选项指定头文件路径,例如: gcc -I/path/to/header file.c -o file 2. 缺少相关开发库 有些头文件需要使用对应的开发库才能编译,如果没有正确安装相应的开发库,就会不到文件解决方法: 可以通过包管理器安装缺少的开发库,例如: sudo apt-get install lib<library>-dev 其中<library>为对应的开发库名称。 3. 文件名大小写不一致 在Linux中,文件名大小写是敏感的,如果头文件名与实际文件名大小写不一致,就会不到文件解决方法: 可以检查头文件名和实际文件名是否大小写一致,如果不一致,可以修改文件名或者修改包含路径中的大小写。例如: #include "Header.h" // 头文件名为Header.h,实际文件名为header.h 修改为: #include "header.h" 总之,在编译不到文件通常是由于配置不正确或者文件问题引起的,针对不同的情况,可以采取不同的解决方法。在编译遇到问题不要慌张,耐心地排查问题,一定能成功编译出代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值