最近在学习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
ok, 这里是通过动态链接库的形式链接c些的函数的 如果把hello.so删除点发现就无法运行了。
发现javaeye博客对chrome支持力度不够阿。
725

被折叠的 条评论
为什么被折叠?



