目前go动态库的生产只支持Linux,Windows下会报这样的错误,-buildmode=plugin not supported on windows/amd64
CODE
plugin.so
package main
import (
"fmt"
)
func DCall(){
fmt.Println(“plugin.so was called”)
}
func DCallWithParam(msg string){
fmt.Println(“参数内容为:”,msg)
}
func main() {
fmt.Println("goroute全部退出")
}
pluginload.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 build –buildmode=plugin plugin.go
调用动态库
go run pluginload.go
使用Golang写C的动态库,当前项目目录
root@working-srv: tree ./
./
|– hello
| -- main.go
– main.c
1
2
3
4
5
6
7
root@working-srv: more hello/main.go
package main
import “C”
func main() {}
//export Hello
func Hello() string {
return “Hello”
}
//export Test
func Test() {
println(“export Test”)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@working-srv: more main.c
#include
#include
void main()
{
GoString str;
str=Hello();
Test();
printf(“%s\n”,str);
}
1
2
3
4
5
6
7
8
9
10
11
12
首先将hello/main.go编译成动态库,使用下面的命令
go build -x -v -ldflags “-s -w” -buildmode=c-shared -o libhello.so hello
root@working-srv: tree ./
./
|– hello
| -- main.go
– main.c
|-- libhello.h
|-- libhello.so
执行完毕的目录结构到多了libhello.h 和 libhello.so
使用下面的命令编译C文件.(-L指定动态链接库目录 -l指定动态链接库文件 -I指定头文件目录)
gcc -I./ -L./ -lhello -o main main.c
root@working-srv: tree ./
./
|– hello
| -- main.go
– main.c
|-- libhello.h
|-- libhello.so
|-- main
这里可以看到编译出了main文件.
root@working-srv: ./main
export Test
Hello
root@working-srv: ./main
export Test
Hello
这里有个注意的地方就是main.go文件中的//export Hello 和 //export Test这个是有作用的,没有这个就不会生成对应的头文件方法.也就是此方法就不会被导出.