go和c混编

c主程序中调用go语言函数
go语言函数调用c语言函数

  • 概述
代码目录:
	[root@localhost test1]# tree 
	.
	├── a.out
	├── foo.c
	├── foo.h
	├── libtest.h
	├── libtest.so
	├── main.c
	├── main.go
	└── num.c

编译:
	mv main.c ../
	go build -o libtest.so -buildmode=c-shared 
	mv ../main.c .
	gcc main.c foo.c num.c -L. -ltest

测试:
	[root@localhost test1]# ./a.out 
	c main a_local[100]
	c main a_bygo[100]
	c main a_local[50]
	c main a_bygo[50]

FAQ:
1:go语言函数需要编译成库的形式给c语言进行调用,如示例中使用-buildmode=c-shared进行编译,go中需要对接口进行export 
2:通过// #include "foo.h" import "C",C.init(ptr)类似的方式在go中调用c语言封装的函数
  • main.c
#include <stdio.h>


#include "libtest.h"

extern int a;

int main()
{
        printf("c main a_local[%d]\n", a);
        go_init(&a);
        printf("c main a_bygo[%d]\n", go_geta());
        go_seta(50);
        printf("c main a_local[%d]\n", a);
        printf("c main a_bygo[%d]\n", go_geta());
}
  • foo.h
int geta();
int seta(int);
int init(int *);
  • foo.c
static int *a;


int geta() {
        return *a;
}

int seta(int v) {
        *a = v;
}

int init(int * ptr) {
        a = ptr;
}
  • num.c
int a= 100;
  • main.go
package main

// #include "foo.h"
import "C"



//export go_geta
func go_geta() C.int {
        return C.geta()
}

//export go_seta
func go_seta(v C.int) {
        C.seta(v)
}

//export go_init 
func go_init(ptr *C.int) {
        C.init(ptr)
}

func main() {
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值