我想使用 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 中搜索所需的库,而无需设置环境变量。我怎样才能实现它?
我能够通过将-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)
| 归档时间: |
|
| 查看次数: |
6378 次 |
| 最近记录: |