要构建可从C调用的档案,您需要将其标记为导出的CGo符号。
例如,如果我创建一个
foo.go具有以下内容的文件:
package mainimport ( "C" "fmt")//export PrintIntfunc PrintInt(x int) { fmt.Println(x)}func main() {}要注意的重要事项是:
- 该包需要调用
main
- 您需要一个
main
函数,尽管它可以为空。 - 您需要导入软件包
C
- 您需要特殊的
//export
注释来标记要从C调用的函数。
我可以使用以下命令将其编译为C可调用静态库:
go build -buildmode=c-archive foo.go
结果将是一个存档
foo.a和一个标头
foo.h。在标题中,我们得到以下内容(不相关的部分):
...typedef long long GoInt64;...typedef GoInt64 GoInt;...extern void PrintInt(GoInt p0);...
这样就足以调用导出的函数。我们可以编写一个简单的C程序来调用它,如下所示:
#include "foo.h"int main(int argc, char **argv) { PrintInt(42); return 0;}我们可以使用以下命令来编译它:
gcc -pthread foo.c foo.a -o foo
该
-pthread选项是必需的,因为Go运行时使用了线程。当我运行生成的可执行文件时,它会打印出来
42。



