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

Francesco中国:

我想从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中搜索所需的库,而无需设置环境变量。我该如何实现?

Francesco中国:

我能够解决将-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用户:如果仍然引发错误,则需要创建一个符号链接或将XXX.so库重命名为XXX.so.0。以我为例:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档