Go VS C

Go与C联编实例

windows系统下基于vs code编辑环境实现go与c的静态链接库编译

Posted by 矫红岩 on October 25, 2018

环境配置

首先需要配置go和c的编译环境
Go的环境配置在上一篇博客中有详细介绍
C的编译需要安装gcc(The GNU Compiler Collection)
我装的是MinGW(Minimalist GNU for Windows),下载地址
安装时,Architecture选择x86_64
然后将安装后的gcc的bin文件路径添加到环境变量GOPATH之后,如图所示
image

编译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)
}

如图所示 image
左边的框是目录结构,我在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)))
}

运行程序

三种方式

  1. 点击绿色三角(Start Debugging)
  2. 若添加了Code Runner扩展的可以右键Run Code
  3. 在终端(Terminal)输入run main.go 这里我用的是右键Run Code可以看到输出结果的同时会给出运行时间