cgo的简单尝试

研究ethereum源码的时候,运行其椭圆曲线签名算法提示我错误,说是找不到gcc。

然后我就安装好gcc后才运行成功。我想这是用go源码调用c代码啊,好像是一个叫cgo的功能来者。好奇心的驱动下,写了两个demo感受了一下。

C代码直接写在go源码里

package main
/*
#include <stdio.h>
int Sum(int a, int b)
{
	return a+b;
}
*/
import "C"
import "fmt"

func main(){
	var a, b int32 = 1, 2
	s := C.Sum(C.int(a), C.int(b))
	fmt.Println(s)
}

代码如上,直接运行即可看到效果。

这里的import "C"不是把包导入进来,这里的C是命名空间的概念。要把C源代码用注释符号注释起来,并且要紧跟着import "C",中间不能有空行,不然会报错。空行会报错这个挺无厘头的,感觉更像是golang的bug。

 

C源码单独成文件,内容供go调用

foo.h

#ifndef _FOO_H

extern int count;
void foo();

#endif

foo.c

#include <stdio.h>
#include "foo.h"
int count=2;
void foo()
{
    printf("c foo");
}

main.go

package main
//#include "foo.h"
import "C"
import "fmt"

func main() {
	//C.count = 6
	fmt.Println(C.count)
	C.foo()
}

这里有点特别,不能直接运行go run main.go,而是要main.go的目录下运行

go build

就会生成可执行文件,然后在命令行下运行该可执行文件即可。

(全文完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值