gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:44:45 26 4
gpt4 key购买 nike

我想在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com