Skip to content

C和Go相互调用

1. Go 调用 C

C 代码写在 Go 代码注释里

go
package main

// int add(int a, int b) {
// 	return a + b;
// }
import "C"
import (
	"fmt"
)

func main() {
	fmt.Println(C.add(1, 2))
}

然后执行:

shell
go run main.go

C 和 Go 使用不同的文件

add.c

c
int add(int a, int b) {
	return a + b;
}

main.go

go
package main

// #include "add.c"
import "C"
import (
	"fmt"
)

func main() {
	fmt.Println(C.add(1, 2))
}

然后执行:

shell
go run main.go

2. C 调用 Go

add.go

go
package main

import "C"

//export add
func add(a, b C.int) C.int {
	return a + b
}

func main() {}

main.c

c
#include <stdio.h>
#include "add.h"

int main() {
	printf("Hi from C\n");
	printf("%d", add(1, 2));
	return 0;
}

执行:

shell
go build -buildmode=c-archive -o add.a add.go

会生成 add.h 和 add.a 文件,然后执行:

shell
gcc add.a main.c -o main

注:通过 go help buildmode 可以查看更多帮助信息

3. 参考