研究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
就会生成可执行文件,然后在命令行下运行该可执行文件即可。
(全文完)