环境配置
首先需要配置go和c的编译环境
Go的环境配置在上一篇博客中有详细介绍
C的编译需要安装gcc(The GNU Compiler Collection)
我装的是MinGW(Minimalist GNU for Windows),下载地址
安装时,Architecture选择x86_64
然后将安装后的gcc的bin文件路径添加到环境变量GOPATH之后,如图所示
编译c
环境配好之后就可以开始码代码了
现在GOPATH/src的目录下新建一个Go项目的文件夹,在文件夹下新建一个C的文件夹
以一个最简单的C程序为例
//test.h
int add(int,int);
//test.c
int add(int a,int b){
return a+b;
}
写好了.h和.c文件后,用gcc进行编译
gcc -c test.c
ar -crv libtest.a test.o
第一步的gcc -c命令会生成.o的对象文件
第二步将中间文件编译为.a静态链接库文件,通常.a文件的命名方式都会在前面加上lib
go程序
package main
// #cgo CFLAGS: -I./test
// #cgo LDFLAGS: -L./test -ltest
// #include "test.h"
import "C"
import "fmt"
func main() {
a := C.int(2)
b := C.int(3)
value := C.add(a, b)
fmt.Printf("%v\n", value)
}
如图所示
左边的框是目录结构,我在src目录下新建的go项目CGO文件夹,里面是main.go文件和test文件夹,test文件夹里编译好c的程序
解析go程序
CFLAGS中的-I表示.h头文件所在的路径
LDFLAGS的-L表示.lib(或.a)文件所在路径
-l表示在该路径下的库名称
import “C”与上文中不可以有空行
这里用的是相对路径,不能使用绝对路径,当程序很大时可以借助pkg-config管理
一个go程序中只能有一个main函数,这个例子也可以简写
func main() {
fmt.Printf("%v\n", C.add(C.int(2), C.int(3)))
}
运行程序
三种方式
- 点击绿色三角(Start Debugging)
- 若添加了Code Runner扩展的可以右键Run Code
- 在终端(Terminal)输入run main.go 这里我用的是右键Run Code可以看到输出结果的同时会给出运行时间