Go和C联合编程

原创
2010/06/04 10:30
阅读数 1.9K

最近在学习go。 看了一段时间后,发现其中有个cgo的命令,使得go语言程序可以调用c语言的函数。这个是很要用处的,因为现在的很多的大型程序都是用c写的,那么如果一下子转用go去重写无疑会加大工程量和成本。 下面就用一个简单的例子来演示怎么在go语言中调用c的函数:

Go代码 
  1. //hello.go  
  2. package hello  
  3.   
  4.   
  5. // int Add(int a,int b) {  
  6. //     return a + b;  
  7. // }  
  8. import "C"  
  9. import "fmt"  
  10.   
  11. func AddPrint(a int ,b int) {  
  12.     fmt.Println(C.Add(C.int(a),C.int(b)))  
  13. }  
 

要注意的是这个import "C"前面注释的代码就是c代码,当然也可以把它些在hello.c hello.h文件里面,并且把注释替换成 // #include "hello.h" 就可以拉,这里只是为了简单。 下面就是主程序的入口拉。 

Go代码 
  1. //main.go  
  2. package main  
  3.   
  4. import "hello"  
  5.   
  6. func main(){  
  7.     var a = 13  
  8.     var b = 26  
  9.     hello.AddPrint(a,b)  
  10. }  
 

 

关键在编译。

Shell代码 
  1. $8g -o _go_.8 hello.cgo1.go _cgo_gotypes.go  
  2. $8c -FVw -I"$GOROOT/src/pkg/runtime" _cgo_defun.c    
  3. $gopack grc _obj/hello.a _go_.8 _cgo_defun.8   
  4. $cp _obj/hello.a "$GOROOT/pkg/linux_386/hello.a"   
  5. $gcc -m32 -fPIC -O2 -o hello.cgo2.o -c hello.cgo2.c   
  6. $gcc -m32 -o _cgo_.so hello.cgo2.o -shared -lpthread -lm   
  7. $cp _cgo_.so "$GOROOT/pkg/linux_386/hello.so"   
  8. $8g main.go $8l -o main main.8 $rm hello.cgo2.c   
  9. $./main   
  10. 39   
 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部