Golang加载共享库时提示"no such file or directory"但文件实际存在的解决方法
Golang加载共享库时提示"no such file or directory"但文件实际存在的解决方法

经过数小时与CGO的缠斗,我终于成功编译了我的代码,但现在二进制文件无法运行
链接器通常不会在当前目录中查找共享库。需要将共享库安装到系统库路径中,或者需要通过设置 LD_LIBRARY_PATH 环境变量等类似方式来处理。
(顺便提一下,这并非 Go 语言特有的问题。)
更多关于Golang加载共享库时提示"no such file or directory"但文件实际存在的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go中通过CGO加载共享库时遇到“no such file or directory”错误,通常是由于运行时动态链接器无法定位共享库文件所致。即使文件确实存在,如果不在动态链接器的搜索路径中,也会出现此问题。
以下是几种解决方法:
1. 设置LD_LIBRARY_PATH环境变量
将共享库所在目录添加到LD_LIBRARY_PATH环境变量中:
export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH
./your_binary
2. 使用rpath链接选项
在编译时通过-rpath选项指定运行时库搜索路径:
// #cgo LDFLAGS: -L/path/to/library -Wl,-rpath,/path/to/library -lyourlib
import "C"
3. 将库文件放在标准库路径
将共享库复制到标准库目录(如/usr/lib或/usr/local/lib):
sudo cp libyourlib.so /usr/local/lib/
sudo ldconfig
4. 使用绝对路径直接加载
在代码中直接使用绝对路径加载库:
// #cgo LDFLAGS: /absolute/path/to/libyourlib.so
import "C"
示例代码
假设你有一个名为libexample.so的共享库,位于/home/user/libs目录:
package main
// #cgo LDFLAGS: -L/home/user/libs -Wl,-rpath,/home/user/libs -lexample
// #include <stdlib.h>
// #include "example.h"
import "C"
import "fmt"
func main() {
result := C.example_function()
fmt.Printf("Result: %d\n", result)
}
编译和运行:
# 方法1:设置环境变量
export LD_LIBRARY_PATH=/home/user/libs:$LD_LIBRARY_PATH
go build -o main main.go
./main
# 方法2:使用rpath(推荐)
go build -o main main.go
./main
调试技巧
使用ldd命令检查二进制文件的库依赖:
ldd your_binary
使用strace跟踪系统调用:
strace ./your_binary 2>&1 | grep open
这些方法应该能解决共享库加载问题。最常见的原因是LD_LIBRARY_PATH未正确设置或rpath未在链接时指定。

