最近在学习go。 看了一段时间后,发现其中有个cgo的命令,使得go语言程序可以调用c语言的函数。这个是很要用处的,因为现在的很多的大型程序都是用c写的,那么如果一下子转用go去重写无疑会加大工程量和成本。 下面就用一个简单的例子来演示怎么在go语言中调用c的函数:
- //hello.go
- package hello
- // int Add(int a,int b) {
- // return a + b;
- // }
- import "C"
- import "fmt"
- func AddPrint(a int ,b int) {
- fmt.Println(C.Add(C.int(a),C.int(b)))
- }
要注意的是这个import "C"前面注释的代码就是c代码,当然也可以把它些在hello.c hello.h文件里面,并且把注释替换成 // #include "hello.h" 就可以拉,这里只是为了简单。 下面就是主程序的入口拉。
- //main.go
- package main
- import "hello"
- func main(){
- var a = 13
- var b = 26
- hello.AddPrint(a,b)
- }
关键在编译。
- $8g -o _go_.8 hello.cgo1.go _cgo_gotypes.go
- $8c -FVw -I"$GOROOT/src/pkg/runtime" _cgo_defun.c
- $gopack grc _obj/hello.a _go_.8 _cgo_defun.8
- $cp _obj/hello.a "$GOROOT/pkg/linux_386/hello.a"
- $gcc -m32 -fPIC -O2 -o hello.cgo2.o -c hello.cgo2.c
- $gcc -m32 -o _cgo_.so hello.cgo2.o -shared -lpthread -lm
- $cp _cgo_.so "$GOROOT/pkg/linux_386/hello.so"
- $8g main.go $8l -o main main.8 $rm hello.cgo2.c
- $./main
- 39