2014-06-10 37 views
5

我有一个.so文件,其功能我想在我的Go代码中调用。如何在Go中调用Linux共享库函数?

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

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

有人可以帮忙吗?

+0

[我可以与Go(Google)编程语言使用共享对象吗?](http://stackoverflow.com/questions/2254777/can-i-use-shared-objects-with-go-google-编程语言) – OneOfOne

回答

4

如果要在编译时使用静态已知的共享库,则可以简单地使用cgo。阅读关于如何做到这一点的文档,但通常你会指定一些链接器标志和一些注释掉的行。以下是如何从libfoo.so调用功能bar()的示例。

package example 

// #cgo LDFLAGS: -lfoo 
// 
// #include <foo.h> 
import "C" 

func main() { 
    C.bar() 
} 

您还可以使用cgo访问在运行时动态加载的共享对象。您可以使用dlopen(),dlsym()dlclose()来打开共享库,检索其中一个函数的地址并最终关闭该库。注意,你不能在Go中做这些事情,你必须在C中编写一些包装代码,为你实现必要的逻辑。

+0

我看到我必须在注释部分指定头部函数,然后调用它们。让我看看我能做些什么。 –

+0

@AgnivaDeSarker我可能会误解你的问题。让我重述一下我的答案。 – fuz

+0

是的,这就是我想要的!我只是错过了LDFLAGS部分。 –