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

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

经过数小时与CGO的缠斗,我终于成功编译了我的代码,但现在二进制文件无法运行

2 回复

链接器通常不会在当前目录中查找共享库。需要将共享库安装到系统库路径中,或者需要通过设置 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未在链接时指定。

回到顶部