如何在Go中调用linux共享库函数?

时间:2014-06-10 19:23:10

标签: go shared-libraries

我有一个.so文件,我想在Go代码中调用它的函数。

我该怎么做呢?我已经阅读了cgo和syscall包。它们接近我想要的但我没有看到任何可以在.so文件中调用函数的地方。

我想要实现ctypes包在Python中的功能。

有人可以帮忙吗?

1 个答案:

答案 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中编写一些包装代码,为你实现必要的逻辑。