golang 生成 shared object 供其他語言使用
golang 生成 shared object 供其他語言使用
LINUX so 檔案基本概念和命名規則
libxmns.so.1.2.3 1 major 2 minor 3 release
- major 增加,原有函式介面已經不能使用,minor和release 復歸於0
- minor 增加, 新增加了一些函式介面,但原有函式介面還能使用, release 復歸於0
- release 增加,修改一些bug, 函式介面不變
c-go
模板-供c、java等編譯型語言或指令碼語言使用
package main import "C" import "fmt" //export Sum func Sum(a int, b int) int { return a + b } //export GetName func GetName(firstName string) string{ return fmt.Sprint(firstName,"-so") } func main(){ }
注意,即使是要編譯成動態庫,也要有main函式,上面的import "C"一定要有 而且一定要有註釋
編譯
go build -buildmode=c-shared -o libhello.so .\libhello.go
使用lua指令碼語言呼叫
使用到的庫: lua2go
luajit 環境變數配置
export LUA_PATH="~/?.lua;;" export LUAJIT_LIB=/usr/local/openresty/luajit/lib export LUAJIT_INC=/usr/local/openresty/luajit/include/luajit-2.1 export LUAJIT_HOME=/usr/local/openresty/luajit PATH=$PATH:$LUAJIT_HOME/bin export PATH
呼叫demo
local lua2go = require('lua2go') local example = lua2go.Load('./libvibrant.so') lua2go.Externs[[ extern GoInt32 Sum(GoInt32 a,GoInt32 b); ]] print(example.Sum(1,100))
呼叫測試
luajit test_go.lua
plug 模式
1、golang 1.8+ 支援
模板
package main import ( "fmt" ) func DCall(){ fmt.Println("plugin.so was called") } func DCallWithParam(msg string){ fmt.Println("引數內容為:",msg) } func main() { fmt.Println("goroute全部退出") }
編譯
go build --buildmode=plugin plugin.go
使用
package main import ( "plugin" ) func main() { //載入動態庫 p, err := plugin.Open("plugin.so") if err != nil { panic(err) } //查詢函式 f, err := p.Lookup("DCall") if err != nil { panic(err) } //轉換型別後呼叫函式 f.(func())() f2, err := p.Lookup("DCallWithParam") if err != nil { panic(err) } //帶參函式的呼叫 f2.(func(string))("hello world,plugin.so") }
go buildmode 說明
The 'go build' and 'go install' commands take a -buildmode argument which indicates which kind of object file is to be built. Currently supported values are: -buildmode=archive Build the listed non-main packages into .a files. Packages named main are ignored. -buildmode=c-archive Build the listed main package, plus all packages it imports, into a C archive file. The only callable symbols will be those functions exported using a cgo //export comment. Requires exactly one main package to be listed. -buildmode=c-shared Build the listed main package, plus all packages it imports, into a C shared library. The only callable symbols will be those functions exported using a cgo //export comment. Requires exactly one main package to be listed. -buildmode=default Listed main packages are built into executables and listed non-main packages are built into .a files (the default behavior). -buildmode=shared Combine all the listed non-main packages into a single shared library that will be used when building with the -linkshared option. Packages named main are ignored. -buildmode=exe Build the listed main packages and everything they import into executables. Packages not named main are ignored. -buildmode=pie Build the listed main packages and everything they import into position independent executables (PIE). Packages not named main are ignored. -buildmode=plugin Build the listed main packages, plus all packages that they import, into a Go plugin. Packages not named main are ignored.