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

Fra*_*ina 3 go

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

src/ctest/
      |- lib/
      |    |- libmylib.so
      |    |- libmylib.h
      |- main.go
Run Code Online (Sandbox Code Playgroud)

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

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

func main() {
    C.testMyLib()
}
Run Code Online (Sandbox Code Playgroud)

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

error while loading shared libraries: libmylib.so.0: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*ina 5

我能够通过将-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()
}
Run Code Online (Sandbox Code Playgroud)

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

仅适用于Linux用户:如果仍然抛出错误,则需要创建符号链接或将XXX.so库重命名为XXX.so.0。就我而言,是:

src/ctest/
  |- lib/
  |    |- libmylib.so
  |    |- libmylib.so.0 <- symlink to ./libmylib.so
  |    |- libmylib.h
  |- main.go
Run Code Online (Sandbox Code Playgroud)