内容简介:注意,即使是要编译成动态库,也要有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 自然语言生成任务上的进步
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
安全测试指南(第4版)
OWASP基金会 / 电子工业出版社 / 2016-7-1 / CNY 89.00
软件安全问题也许是这个时代面临的*为重要的技术挑战。Web应用程序让业务、社交等网络活动飞速发展,这同时也加剧了它们对软件安全的要求。我们急需建立一个强大的方法来编写和保护我们的互联网、Web应用程序和数据,并基于工程和科学的原则,用一致的、可重复的和定义的方法来测试软件安全问题。本书正是实现这个目标的重要一步,作为一本安全测试指南,详细讲解了Web应用测试的“4W1H”,即“什么是测试”、“为什......一起来看看 《安全测试指南(第4版)》 这本书的介绍吧!