error while loading shared libraries: libgo.so.19 错误的解决

本文记录了解决Golang程序在不同操作系统间移植时出现的动态库加载错误问题的过程,包括尝试安装依赖包、建立工程环境等方法,并最终发现需要确保宿主机与目标机的编译器版本一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中在运行golang编译出来的可执行程序时,出现了以下错误:

root [ ~ ]# /mnt/main_test
/mnt/main_test: error while loading shared libraries: libgo.so.19: cannot open shared object file: No such file or directory

一开始以为是个很小、很容易解决的问题,于是直接在网上搜索解决方法。但发现并没有人遇到同样的错误,只是有比较接近的错误,如:linux 缺少动态连接库.so--cannot open shared object file: No such file or directory

Linux error while loading shared libraries: cannot open shared object file: No such file or directory其中的解决方法并不适合本案,因此只能自行定位解决。

起初怀疑是没有相应的包导致,于是通过sudo apt install gccgo安装相应的包,问题还是存在。

又因为同组者也有使用golang编写的项目代码,她那里并未遇到这个问题。于是向她请教解决方法,她答复说需要建立工程环境才可以。按照她的解决方法,确实是可以了,程序能够正常运行起来。于是有了之前的一篇随笔文章 golang工程建立_蓝天居士的博客-优快云博客_golang 新建项目

但是第二天在我的另一台机器上,按照昨天同样的步骤,建立工程再编译,之后放到出现错误的电脑上运行,又出现了同样的错误。一时间觉得摸不着头脑了……

冷静下来仔细思考,终于明白了问题所在,原来是这样:

我手边有两台机器,一台机器安装的是Ubuntu22.04,另一台机器安装的是自研系统。我之前写golang代码、编译都是在Ubuntu22.04这台机器上,因此编译和运行在Ubuntu的机器上是没有问题的,但是放到安装了自研系统的机器上,由于go编译器的版本不同,相应的动态库名称也就不同,当然就会出现错误。至于同事没有遇到这个问题,是因为她本身就是在自研系统的机器上编写、编译和运行golang代码的,宿主机和目标机本来就是一个系统,因此就没有出现这个问题。

将我的golang项目源码拷贝到安装自研系统的机器上编译再运行,问题就不存在了。

事情虽然不大,但是对于此类“error while loading shared libraries: libxx.xx.xx”问题提供了另一种解决思路,即关注宿主机和目标机的操作系统以及编译器版本的差异。 

### 解决 error while loading shared libraries: libclntsh.so.19.1 的错误 当遇到“error while loading shared libraries: libclntsh.so.19.1”错误时,这通常表明系统在运行程序时无法找到或正确加载所需的共享库文件。以下是详细的解决方法: #### 1. 确认共享库是否存在 检查`libclntsh.so.19.1`是否存在于系统的库路径中。可以使用以下命令查找: ```bash find / -name "libclntsh.so.19.1" 2>/dev/null ``` 如果未找到该文件,则需要安装对应的Oracle客户端库[^2]。 #### 2. 设置动态链接器搜索路径 如果共享库文件存在但系统无法找到它,可以通过设置环境变量`LD_LIBRARY_PATH`来指定库的路径。例如,如果库位于`/opt/oracle/lib`目录下,可以执行以下命令: ```bash export LD_LIBRARY_PATH=/opt/oracle/lib:$LD_LIBRARY_PATH ``` 此操作会使当前会话下的程序能够找到共享库[^2]。 #### 3. 更新动态链接器缓存 为了使系统永久识别新增的共享库路径,可以编辑`/etc/ld.so.conf`文件或创建一个新的配置文件(如`/etc/ld.so.conf.d/oracle.conf`),然后将共享库所在的目录添加到文件中。例如: ```bash echo "/opt/oracle/lib" | sudo tee -a /etc/ld.so.conf.d/oracle.conf sudo ldconfig ``` 这将更新系统的动态链接器缓存,使得所有程序都能找到新增的共享库[^2]。 #### 4. 检查库文件的位数 确保共享库文件与操作系统和应用程序的位数匹配。例如,64位的系统应使用64位的库文件。可以通过以下命令检查库文件的位数: ```bash file /opt/oracle/lib/libclntsh.so.19.1 ``` 如果发现位数不匹配,则需要下载并安装正确的版本[^4]。 #### 5. 使用`rpath`指定运行时库路径 如果希望可执行文件在运行时自动查找特定目录下的共享库,可以在编译时使用`-Wl,-rpath`选项。例如: ```bash gcc -o myprogram myprogram.c -L/opt/oracle/lib -lclntsh -Wl,-rpath=/opt/oracle/lib ``` 这样,即使没有设置`LD_LIBRARY_PATH`,程序也能正确加载共享库[^3]。 #### 6. 检查权限问题 确保共享库文件具有适当的权限,允许程序读取和执行。可以使用以下命令检查和修改权限: ```bash ls -l /opt/oracle/lib/libclntsh.so.19.1 chmod 644 /opt/oracle/lib/libclntsh.so.19.1 ``` #### 7. 验证依赖关系 使用`ldd`命令验证可执行文件的依赖关系是否完整。例如: ```bash ldd /path/to/executable ``` 如果输出中显示某些库未找到,则需要安装这些库或调整路径[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值