概述
在实际工作中,我们可能会出现跨部门之间协助,假如某部门给你提供一个c写的so,让你们自己去调用
模拟
构建so
c源码
#include <>
void SayHello(const char* s) {
puts(s);
}
编译为so
[~]# gcc -shared -o
Go调用
安装依赖
[~]# go get /rainycape/dl
调用过程
package main
import "C"
import "/rainycape/dl"
func main() {
lib, err := dl.Open("./", 0)
if err != nil {
panic(err)
}
defer lib.Close()
var SayHello func(src *C.char) // 定义函数变量匹配 libhello 中的 SayHello 函数
lib.Sym("SayHello", &SayHello) // 定位 SayHello 函数地址
SayHello(C.CString("hello world"))
}
执行结果
[~]# go run
hello world
总结
- 这种方式比cgo调用会来得更加直接