ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

go和c混编

2019-08-05 15:38:39  阅读:267  来源: 互联网

标签:foo int geta 混编 init go main


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() {
}

标签:foo,int,geta,混编,init,go,main
来源: https://blog.csdn.net/javaxflinux/article/details/98489700

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有