我有一个.so文件,我想在Go代码中调用它的函数。
我该怎么做呢?我已经阅读了cgo和syscall包。它们接近我想要的但我没有看到任何可以在.so文件中调用函数的地方。
我想要实现ctypes包在Python中的功能。
有人可以帮忙吗?
答案 0 :(得分:4)
如果要使用在编译时静态已知的共享库,只需使用cgo即可。阅读有关如何准确执行此操作的文档,但通常指定一些链接器标志和几个注释掉的行。以下是有关如何从bar()
调用函数libfoo.so
的示例。
package example
// #cgo LDFLAGS: -lfoo
//
// #include <foo.h>
import "C"
func main() {
C.bar()
}
您还可以使用cgo访问在运行时动态加载的共享对象。您可以使用dlopen()
,dlsym()
和dlclose()
打开共享库,检索其中一个函数的地址,最后关闭库。请注意,你不能在Go中做这些事情,你必须在C中编写一些包装代码,为你实现必要的逻辑。