go - 如何从相对路径使用动态链接库

标签 go

我想在 go 应用程序中使用动态 C 库,我可以构建该应用程序,但在运行时找不到该库。 这是我的项目的结构:

src/ctest/
      |- lib/
      |    |- libmylib.so
      |    |- libmylib.h
      |- main.go

在 main.go 中导入 .h 和 .so 文件:

/*
#cgo CFLAGS: -I./lib
#cgo LDFLAGS: -L./lib -lmylib
#include <mylib.h>
*/
import "C"

func main() {
    C.testMyLib()
}

我可以成功构建应用程序,但启动时会抛出此错误:

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

如果我将 libmylib.so 文件复制到/usr/lib 中,那么一切都会按预期进行;但是,我希望我的应用程序在运行时自动在 CURRENT_PATH/lib 中搜索所需的库,而无需设置环境变量。我怎样才能实现它?

最佳答案

我能够解决将 -Wl,-rpath=\$ORIGIN/lib 链接器标志添加到 main.go 文件中的 LDFLAGS 选项的问题:

package main
/*
#cgo CFLAGS: -I${SRCDIR}/lib
#cgo LDFLAGS: -L${SRCDIR}/lib -Wl,-rpath=\$ORIGIN/lib -luiohook
#include <uiohook.h>
*/
import "C"

func main() {
    C.hook_run()
}

现在当应用程序执行时,它还使用 CURRENT_FOLDER/lib 来搜索动态库(CURRENT_FOLDER 是执行应用程序可执行文件的目录)。

仅限 Linux 用户: 如果仍然抛出错误,则需要创建符号链接(symbolic link)或将 XXX.so 库重命名为 XXX.so.0。在我的例子中是:

src/ctest/
  |- lib/
  |    |- libmylib.so
  |    |- libmylib.so.0 <- symlink to ./libmylib.so
  |    |- libmylib.h
  |- main.go

关于go - 如何从相对路径使用动态链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44210731/

相关文章:

string - 如何保存呈现的模板而不是打印到 os.Stdout?

checkbox - 在 golang 中检查复选框的惯用方式

go - 如何使用 map 在 cookie 中传递多个值

amazon-web-services - 使用 AWS SAM 3 秒后 AWS Lambda 函数超时

go - 为什么 go 编译器说结构不满足接口(interface)?

python - 将具有内部条件的循环从 python 转换为 golang

memory-management - Golang 中 []byte 和 string 转换的技术问题

go - 如何在包括内部软件包的整个项目上运行“go vet”?

中断调用 net.LookupHost by time.After 时 golang 内存泄漏

go - 读取 Go gctrace 输出