【GoLand】Cgo的使用方法和原理

2,901 阅读2分钟

一、Go语言中调用C语言

1.通过在.go文件写注释的方式可以实现go调用c

package main

/*
#cgo linux,arm64 CFLAGS: -fPIC -DVOS_OS_VER=VOS_LINUX -DVOS_CPU_TYPE=VOS_CORTEXA57 -DVOS_HARDWARE_PLATFORM=VOS_ARM -DVOS_WORDSIZE=64 -DVOS_BYTE_ORDER=VOS_LITTLE_ENDIAN
#cgo linux,amd64 CFLAGS: -fPIC -DVOS_OS_VER=VOS_LINUX -DVOS_CPU_TYPE=VOS_X86 -DVOS_HARDWARE_PLATFORM=VOS_X86 -DVOS_WORDSIZE=64 -DVOS_BYTE_ORDER=VOS_LITTLE_ENDIAN
#cgo CFLAGS : -I ./include
#cgo LDFLAGS: -L ./lib  -ldl -lrt
#include <stdio.h>
void PrintSomeThing()
{
	printf("sum\n");
}
*/
import "C"


func main () {
	C.PrintSomeThing()
}

2.cgo注释语法中可以使用OS和CPU类型进行CFLAGS条件使用

linux,arm64 CFLAGS:表示在linux并且为arm64的环境下使用这一行CFLAGS
linux,amd64 CFLAGS:表示在linux并且为amd64的环境下使用这一行CFLAGS

3.CFLAGS作用相当于gcc的编译选项,LDFLAGS作用相当于ld的链接选项

4.注释/**/与import "C"之间不允许有空行,必须紧挨着

二、CGo链接选项和编译选项可配置管理

1.使用pkg-config工具

(1)编写pkg-config工具的配置文件(要以.pc结尾,如config.pc)
Name: module_name // 引用的自定义库的名字,写什么都可以
Description:the description of the module // 自定义库的描述
Version:1.0 // 自定义库的版本
Cflags:-I/usr/include // 头文件搜索路径
Libs:-L/usr/myselflib -lmyselfsdk -ldl -lrt // lib库的搜索路径和具体要链接的库
(2)在go文件注释中显示注释pkg-config + 配置文件
#cgo pkg-config:config
(3)设置环境变量
export PKG_CONFIG_PATH= // 设置到config.pc所在路径下
(4)通过go build构建二进制即可

三、Go语言调用C语言的底层原理

1.通过语法层面将.go文件中的c语法抽离出来生成临时的.c文件

2.将CFLAGS的编译选项作用于临时.c文件,生成.o文件

3.将LDFALGS的链接选项作用于.o文件,链接生成pkg.a

4.将pkg.a链接入go的二进制文件,生成最终ELF格式的二进制可执行文件

5.整个过程可以通过go build -work -x来查看打屏日志信息,-work是保留临时工作目录,-x表示打印完整信息