是什么

CGO通俗来讲是为了实现golang调用C语言编写的程序的辅助工具,按特定格式进行编译,调用C即可直接调用C中实现的函数。

怎么做

下面介绍我自己在调用时的做法,亲测可以正常使用

  • 项目目录结构
    include(xxx.c, xxx.h …)
    lib(c编译出的动态库)
    main.go

  • 头文件
    需要在main.go中添加头文件。

/*
#cgo CFLAGS: -I./include 
#cgo LDFLAGS: -L./lib -xxx
#include <stdio.h>
#include <stdlib.h>
#include "xxx.h"
*/
import "C"

注意import "c"与上面的注释代码没有间隔。
主要分为三块:
1. cgo CFLAGS:编译器标志,将相应的头文件和代码文件include进来
2. cgo LDFLAGS:链接器标志,将相应C代码的动态库include进来
3. 相应的头文件,直接include进来,包括一些基本使用的头文件
然后编译golang代码,编译器会自动编译C代码和动态库,之后正常运行即可。

  • 类型转换
1. 可以直接定义c中类型:a := new(C.int)
2. 类型转换,使用unsafe.Pointer进行指针类型强转。(*C.uchar)(unsafe.Pointer(&testbyteArray[0]))将byte数组首地址指针强转为unsigned char类型

ref

  • https://mp.weixin.qq.com/s/I9IvJnKeJY8IpVB4lcWXNA
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐