自 Go 1.5 发布以来,出现了将 Go 与现有 C 项目集成的可能性。本指南旨在解决如何从 C 程序中调用 Go 代码的问题。
Go 1.5 引入了 -buildmode=c-archive 选项,促进了 C 可调用存档的生成。然而,生成必要的头文件可能会带来挑战。要解决此问题,将函数标记为导出的 CGo 符号至关重要。
为了说明这一点,请考虑 foo.go 中的以下 Go 代码:
package main import ( "C" "fmt" ) //export PrintInt func PrintInt(x int) { fmt.Println(x) } func main() {}
将此代码编译为 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; }
要编译此 C 程序:
gcc -pthread foo.c foo.a -o foo
-pthread 选项是必要的,因为 Go 运行时使用线程。执行后,程序将输出 42。
通过执行以下步骤,您可以在现有 C 项目中有效地使用 Go 代码,受益于 Go 的高级功能,同时保留 C 提供的低级访问权限.
以上是如何在 C 程序中调用 Go 代码?的详细内容。更多信息请关注PHP中文网其他相关文章!