第三方库(闭源)
3rd party libraries (closed source)
有没有一种方法可以用 go 语言用一堆源文件构建二进制文件(共享库或静态库)并将其与接口一起分发。
它不会作为可执行文件分发,而是在编译或 运行 时带有接口的可链接静态或共享库。 (就像在 C 中一样,您分发 .a
或 .so
文件以及头文件)
与基于开源 github 的库不同,它是一个封闭源项目,我正在尝试为 Go 移植。
是的,这是可能的。您可以将代码构建为静态库,并在运行时使用此命令 link 构建代码:
go build -buildmode=plugin
您可以像这样使用内置插件:
符号是指向变量或函数的指针。
例如定义为
的插件
package main
import "fmt"
var V int
func F() { fmt.Printf("Hello, number %d\n", V) }
可以加载Open函数,然后可以访问导出的包符号V和F
p, err := plugin.Open("plugin_name.so")
if err != nil {
panic(err)
}
v, err := p.Lookup("V")
if err != nil {
panic(err)
}
f, err := p.Lookup("F")
if err != nil {
panic(err)
}
*v.(*int) = 7
f.(func())() // prints "Hello, number 7"
type Symbol interface{}
在 go 中查看对 Plugin 的内置支持以获取更多信息
有没有一种方法可以用 go 语言用一堆源文件构建二进制文件(共享库或静态库)并将其与接口一起分发。
它不会作为可执行文件分发,而是在编译或 运行 时带有接口的可链接静态或共享库。 (就像在 C 中一样,您分发 .a
或 .so
文件以及头文件)
与基于开源 github 的库不同,它是一个封闭源项目,我正在尝试为 Go 移植。
是的,这是可能的。您可以将代码构建为静态库,并在运行时使用此命令 link 构建代码:
go build -buildmode=plugin
您可以像这样使用内置插件:
符号是指向变量或函数的指针。
例如定义为
的插件package main
import "fmt"
var V int
func F() { fmt.Printf("Hello, number %d\n", V) }
可以加载Open函数,然后可以访问导出的包符号V和F
p, err := plugin.Open("plugin_name.so")
if err != nil {
panic(err)
}
v, err := p.Lookup("V")
if err != nil {
panic(err)
}
f, err := p.Lookup("F")
if err != nil {
panic(err)
}
*v.(*int) = 7
f.(func())() // prints "Hello, number 7"
type Symbol interface{}
在 go 中查看对 Plugin 的内置支持以获取更多信息