我想在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中搜索所需的库,而无需设置环境变量。我怎样才能实现它?
答案 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分别。