内容简介:注意,即使是要编译成动态库,也要有main函数,上面的import "C"一定要有 而且一定要有注释使用到的库:
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.
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- go语言生成uuid
- 用 RNN 训练语言模型生成文本
- 使用 Go 语言生成伪随机数
- 使用Go语言 生成iOS SDK
- 一文了解自然语言生成演变史!
- [预训练语言模型专题] BART & MASS 自然语言生成任务上的进步
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ordering Disorder
Khoi Vinh / New Riders Press / 2010-12-03 / USD 29.99
The grid has long been an invaluable tool for creating order out of chaos for designers of all kinds—from city planners to architects to typesetters and graphic artists. In recent years, web designers......一起来看看 《Ordering Disorder》 这本书的介绍吧!