内容简介:注意,即使是要编译成动态库,也要有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 自然语言生成任务上的进步
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Facebook Effect
David Kirkpatrick / Simon & Schuster / 2010-6-8 / USD 26.00
《Facebook 效应》的作者近距离地采访了与Facebook相关的人士,其中包括Facebook的创始人、员工、投资人、意向投资人以及合作伙伴,加起来超过了130人。这是真切详实的访谈,更是超级精彩的故事。作者以其细腻的笔触,精巧的叙事结构,解密了Facebook如何从哈佛的宿舍里萌发,创始人的内讧,权力之争,如何放弃华盛顿邮报的投资,怎样争取到第一个广告客户,而第一轮融资又如何获得一亿美元的......一起来看看 《The Facebook Effect》 这本书的介绍吧!