从Go调用so文件中的函数

6 system-calls static-libraries go

是否可以从Go调用静态对象(.so)文件?我一直在搜索谷歌,我一直在追求我能做到的主张

lib, _ := syscall.LoadLibrary("...")
Run Code Online (Sandbox Code Playgroud)

但尝试这样会产生错误

undefined: syscall.LoadLibrary
Run Code Online (Sandbox Code Playgroud)

并通过Godocs搜索我在syscall包中找不到对此函数的引用.是否可以加载库并调用其函数?

Mar*_*all 6

在POSIX平台上,您可以cgo用来调用dlopen和朋友:

// #cgo LDFLAGS: -ldl
// #include <dlfcn.h>
import "C"

import fmt

func foo() {
     handle := C.dlopen(C.CString("libfoo.so"), C.RTLD_LAZY)
     bar := C.dlsym(handle, C.CString("bar"))
     fmt.Printf("bar is at %p\n", bar)
}
Run Code Online (Sandbox Code Playgroud)

  • `bar` 是一个 **void 指针**,如何将其转换为 **函数指针** 并在 Go 中调用它? (2认同)

Not*_*fer 5

就像@JimB所说的,您应该只使用CGO,并将链接放到那里的动态/静态库中。根据此示例:

// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"

...

var x:= C.png_whatever() // whatever the API is
Run Code Online (Sandbox Code Playgroud)

在此处了解更多信息:http : //blog.golang.org/c-go-cgo

  • 可以使用它而不必包含头文件吗? (2认同)