问题陈述:
给定一个已编译的 Go 二进制文件,是否可能动态编译外部 Go 文件并将其链接到现有二进制文件以立即使用
解决方案:
2015 年 8 月的 Go 1.5 版本中引入了创建共享库的功能,该库支持动态加载和链接。
构建和链接的步骤动态:
创建共享库:
使用以下命令将外部 Go 文件编译为共享库-buildmode=共享flag:
go install -buildmode=shared my_library.go
使用动态链接构建二进制文件:
编译 Go将使用 -linkshared 加载和链接共享库的二进制文件标志:
go build -linkshared main.go
示例:
考虑 main.go 中的以下代码:
package main import ( "fmt" "plugin" ) func main() { p, err := plugin.Open("my_library.so") if err != nil { fmt.Println(err) return } runFoo, err := p.Lookup("RunFoo") if err != nil { fmt.Println(err) return } runFoo.(func())() // Call the exported function from the shared library }
注意:共享库必须在 Go 源代码中使用 //export RunFoo 导出函数 RunFoo。
以上是Go 二进制文件可以在运行时动态加载和链接外部编译的 Go 代码吗?的详细内容。更多信息请关注PHP中文网其他相关文章!