1 回答
TA贡献1804条经验 获得超2个赞
要构建可从 C 调用的存档,您需要将它们标记为导出的 CGo 符号。
例如,如果我创建一个foo.go包含以下内容的文件:
package main
import (
"C"
"fmt"
)
//export PrintInt
func 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.
- 1 回答
- 0 关注
- 118 浏览
添加回答
举报