目前有哪些方法允许您在C中调用Go函数?

目前有哪些方法允许您在C中调用Go函数?,c,compilation,go,cgo,C,Compilation,Go,Cgo,我已经看到了很多不同的方法可以做到这一点,没有一种方法在必须使用大量包装器和回调的情况下看起来是理想的。有没有一个简单的方法可以做到这一点 例如,我们有: //foo.go package foo import "C" //export SayFive func SayFive() int { return 5 } 这已经被精简到了最低限度,现在我只想在C中调用SayFive函数 但是,不在该文件的顶部。能够做到这一点非常简单和有用,但我正在寻找这样一种方法: //foo.c

我已经看到了很多不同的方法可以做到这一点,没有一种方法在必须使用大量包装器和回调的情况下看起来是理想的。有没有一个简单的方法可以做到这一点

例如,我们有:

//foo.go

package foo

import "C"

//export SayFive
func SayFive() int {
    return 5
}
这已经被精简到了最低限度,现在我只想在C中调用
SayFive
函数

但是,不在该文件的顶部。能够做到这一点非常简单和有用,但我正在寻找这样一种方法:

//foo.c

#include <stdio.h>

int main() {
    int a = SayFive();
}
//foo.c
#包括
int main(){
int a=SayFive();
}
我在上面的例子中看到,
#包括“\u cgo\u export.h”
,这完全有道理,但当我这样做并试图编译它时,它失败了


有人能解释一下让我们这样做的整个过程吗?

你可以从Go调用C,从C调用Go,但是只能在Go程序框架内使用

因此,带有
main()
的C程序示例将无法工作,因为这将在C程序的框架内调用Go

换句话说,Go不能使对象与C程序静态或动态链接

因此,您必须将您想要做的事情转到它的头上,使Go程序成为主程序,并从中调用C程序部分。这意味着带有
main()
函数的程序必须是Go程序


希望这有意义

谢谢你的回答!如果我运行
go工具cgo foo.go
,它将在
\u obj
中生成一堆C源文件和头文件(默认情况下)。如果没有办法用C语言编写主程序来使用它们?这将涉及到使用
#include“_cgo_export.h”
。非常困难,C内存管理非常不同,需要由它来负责。还有一个问题是如何在其中获得Go运行时。我不认为这曾经是围棋开发者的目标,所以这并不容易!我认为唯一可以做到这一点的方法是使用gccgo,但我想尝试不用它。只是出于好奇,你为什么要这么做?@OneOfOne说实话,现在它没有什么必要或重要的,我只是在尝试它,只是想知道它是否可能。到目前为止,我已经能够做到这一点,但只有与gccgo。