在C程序中使用golang函数

时间:2019-07-12 08:14:46

标签: c go cgo

我创建了一个golang程序,以将一些值传递给c程序。 I used this example to do so

我简单的golang代码:

package main

import "C"

func Add() int {
        var a = 23
        return a 
 }
func main() {}

然后我使用 go build -o test.so -buildmode=c-shared test.go

我的C代码:

#include "test.h"

int *http_200 = Add(); 

当我尝试使用gcc -o test test.c ./test.so

进行编译时

我知道

  

int * http_200 = Add();                    ^   http_server.c:75:17:错误:初始化元素不是恒定的

为什么我会收到此错误?如何在我的C代码中正确初始化该变量。

PS:在第一次评论后进行编辑。

1 个答案:

答案 0 :(得分:3)

这里有几个问题。首先是类型的不兼容。 Go将返回GoInt。第二个问题是必须导出Add()函数以获取所需的头文件。如果您不想更改Go代码,那么在C语言中,您必须使用GoInt的{​​{1}}。

一个完整的例子是:

test.go

long long

test.c

package main

import "C"

//export Add
func Add() C.int {
    var a = 23
    return C.int(a)
}

func main() {}

然后编译并运行:

#include "test.h"
#include <stdio.h>

int main() {
    int number = Add();
    printf("%d\n", number);
}
  

23


使用go build -o test.so -buildmode=c-shared test.go gcc -o test test.c ./test.so && ./test 的第二个示例: test.go

GoInt

test.c

package main

import "C"

//export Add
func Add() int { // returns a GoInt (typedef long long GoInt)
    var a = 23
    return a
}

func main() {}

然后编译并运行:

#include "test.h"
#include <stdio.h>

int main() {
    long long number = Add();
    printf("%lld\n", number);
}
  

23