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

Posted

技术标签:

【中文标题】如何在 Go 中调用 linux 共享库函数?【英文标题】:How can I call linux shared library functions in Go? 【发布时间】:2014-06-10 19:23:09 【问题描述】:

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

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

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

有人可以帮忙吗?

【问题讨论】:

Can i use shared objects with Go (Google) programming language? 的可能重复项 【参考方案1】:

如果您想使用在编译时静态已知的共享库,您可以简单地使用cgo。阅读有关如何准确执行此操作的文档,但通常您会指定一些链接器标志和几行注释掉的行。这是一个关于如何从libfoo.so 调用函数bar() 的示例。

package example

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

func main() 
    C.bar()

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

【讨论】:

我看到必须在注释部分指定header函数,然后调用它们。让我看看我能做什么。 @AgnivaDeSarker 我可能有点误解了你的问题。让我改写我的答案。 是的,这就是我想要的!我只是错过了 LDFLAGS 部分。 @fuz,如果你没有在你提供的 Go 源代码中包含它的名称,Go 怎么知道 so 文件是 libfoo.so @trojek LDFLAGS 指令可以做到这一点。

以上是关于如何在 Go 中调用 linux 共享库函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 Matlab 共享库?

如何在golang 中调用c的静态库或者动态库

如何查看 Linux 共享库正在导出的函数列表?

如何使用“外部函数接口”从 Go 调用 C

如何在 Linux 的 QTCreator 中使用 dlopen 打开的共享库中设置断点

Linux动态链接之GOT与PLT