【LinuxC/C++】error while loading shared libraries:xxx.so:cannot open shared object file 问题解决

BUG信息:

xxxxxx : error while loading shared libraries:xxx.so:cannot open shared object file: No such file or directory

问题背景:在以非root用户,使用服务器管理员分配的账号,访问学校服务器的前提下。使用makefile文件make项目时,发现make时并没有任何错误,能够正常make,并且makefile中各种依赖库的lib路径写的也没毛病,就是在运行时找不到其中的.so文件

后来经过反复搜索,分析问题根本上是在linux执行连接了.so库的可执行程序时,如果未将so文件放入系统指定的so文件搜索路径下,运行程序时会提示找不到对应的so库,输出上方的错误信息,而执行搜索这一工作的是一个叫ld链接器的东西。Linux中的ld链接器找不到所需的该库文件导致报BUG。

问题解决方法:Linux链接器ld默认的搜索目录是/lib/usr/lib,所以so文件应该放在这些路径下,如果so文件放在其他路径也可以,但是需要修改一些系统文件让ld知道库文件在哪里。但是因为是分配的账号,不是root用户,所以很多东西很多文件没办法动权限不够,如果可以的话也可以让系统管理员帮你配一下。但是为了方便快速,可以使用export这种临时环境变量的形式解决该问题。

可以执行下方两条命令,将显示缺失的.so文件所在的文件夹的位置(=后面:前面的路径信息按需要自行修改)赋给LD_LIBRARY_PATH(必须)、LIBRARY_PATH(非必须但是我看有的博主让设置上这个,以防万一)两个变量,这样ld链接器就可以通过搜索这两个变量的位置找寻.so文件,再执行的话就不会报bug了。

export LD_LIBRARY_PATH=/xxxx/zyccc/libtorch/lib:$LD_LIBRARY_PATH

export LIBRARY_PATH=/xxxx/zyccc/libtorch/lib:$LIBRARY_PATH

缺点:上面的命令有效性是临时的,并非永久生效,每次logout再login重连服务器后,都需要再次执行一次,但是对于非root用户来说是个最方便有用的做法了。

你可能感兴趣的:(日常小问题)