一、Go语言中调用C语言
1.通过在.go文件写注释的方式可以实现go调用c
package main
/*
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=
(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表示打印完整信息