在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
http://www.myexception.cn/program/679738.html Go调用C代码,Cgo笔记 参考: 官方文档: http://golang.org/cmd/cgo/ http://blog.golang.org/2011/03/c-go-cgo.html
一份博文,编译过程讲得比较细: http://googollee.blog.163.com/blog/static/1159411201031812128593/
Go语言教程:使用C语言函数: http://chaishushan.blog.163.com/blog/static/130192897201012710273283/
看完上面的教程,基本上知道怎么用Go调用C代码、和需要注意的事项。 至于C调用Go的代码,Go调用汇编代码,以后再研究吧。
以下内容是笔记,列出一些重点等,不解释。
源文件
/* // 这是注释中的注释 #include <stdio.h> #include <errno.h> */ import "C" // #cgo CFLAGS: -DPNG_DEBUG=1 // #cgo linux CFLAGS: -DLINUX=1 // #cgo LDFLAGS: -lpng // #include <png.h> import "C" // #cgo pkg-config: png cairo // #include <png.h> import "C"
编译方法
include $(GOROOT)/src/Make.inc TARG=xdb CGOFILES=xdb.go CGO_CFLAGS+=-L/opt/xunsearch/lib/ -I/opt/xunsearch/include CGO_LDFLAGS+=-lscws -L/opt/xunsearch/lib/ include $(GOROOT)/src/Make.pkg 说明:CFlags等参数,可以写在Go的源代码中
数据类型转换 C -> Go
int(C.int ) // C string to Go string func C.GoString(*C.char) string // C string, length to Go string func C.GoStringN(*C.char, C.int) string // C pointer, length to Go []byte func C.GoBytes(unsafe.Pointer, C.int) []byte
Go -> C
C.char C.schar (signed char) C.uchar (unsigned char) C.short C.ushort (unsigned short) C.int C.uint (unsigned int) C.long C.ulong (unsigned long) C.longlong (long long) C.ulonglong (unsigned long long) C.float C.double. unsafe.Pointer (void*) // Go string to C string func C.CString(string) *C.char var val []byte (*C.char)(unsafe.Pointer(&val[0]))
内存释放
cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) Go创建的对象,可以很好的回收;而C创建的,则需要手动回收
注意事项: 不支持调用像 Printf()
不清楚的地方,问人,或者看别人用Go调用C的代码。
(待完善) http://googollee.blog.163.com/blog/static/1159411201031812128593/ http://my.oschina.net/zengsai/blog/5138 http://my.oschina.net/zengsai/blog/5139 |
请发表评论