如何使用相对路径

时间:2017-05-26 22:07:24

标签: 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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

将CURRENT_PATH / lib添加到/etc/ld.so.conf或/etc/ld.so.conf.d/mylib.conf并运行sudo ldconfig

在CFLAGS&amp;中使用-I和-L的完整路径。 LDFLAGS分别。