无需 cgo 的 Go 构建
生成产物不依赖 import "C"。c2go-libc 使用 PureGo 原生调用桥,让消费者可以在 CGO_ENABLED=0、没有宿主 C 编译器的环境构建。
开始使用CGO_ENABLED=0 go build ./...
# No import "C"
# No host C compiler required使用 C2Go 将 C 源码提前编译成可导入的 Go package,让代码在 Go runtime 中运行,并支持无需 cgo 的消费者构建。
#include <c2go.h>
c2go_extern int add(int a, int b) {
return a + b;
}import "example.com/demo/translated"
result := translated.Add(20, 22)C2Go
C2Go 是一种基于 Clang 的提前编译模式,适合把现有 C 实现复用或迁移到普通 Go package 中。它生成供 Go assembler 使用的 Plan 9 汇编与结构化 manifest,再由 c2go-bind 生成 Go 工具链可以直接构建的 package。
它不会承诺把任意 C 自动改写成人工维护的 Go 源码。C2Go 保留 C 作为实现语言,同时让产物使用 goroutine 栈、Go 调度器和可选的 GC 感知内存模型。
生成产物不依赖 import "C"。c2go-libc 使用 PureGo 原生调用桥,让消费者可以在 CGO_ENABLED=0、没有宿主 C 编译器的环境构建。
开始使用CGO_ENABLED=0 go build ./...
# No import "C"
# No host C compiler requiredstruct managed Node { struct Node *next; };
struct Node *node = gc_malloc(
c2go_typeinfo(struct Node), sizeof(*node));
node->next = gc_malloc(
c2go_typeinfo(struct Node), sizeof(*node->next));
// Both objects are tracked by the Go GC.answer = go_answer(21);func Answer(v int32) int32extern double vendor_scale(double);
double scaled_value(double value) {
return vendor_scale(value);
}register_cb(callback);c2go_callback(on_value)下载与当前宿主平台匹配的 SDK,并固定配套的 c2go-libc 版本。
export C2GO_HOME=/path/to/c2go-sdk
export PATH="$C2GO_HOME/bin:$PATH"
go get github.com/c2gohq/c2go_libc@v0.20260809.0-rc.5c2go-clang 生成 Plan 9 汇编和 JSON manifest。
mkdir -p .c2go
c2go-clang --target="$C2GO_TARGET" \
-fc2go -fc2go-package=example.com/demo/translated \
-fc2go-emit-plan9-asm=.c2go/translated.s \
-fc2go-emit-manifest=.c2go/translated.json \
.c2go/input.cc2go-bind 将产物组装成普通 Go package。
mkdir -p translated
c2go-bind --out=translated --sidecar=.c2go/translated.json \
.c2go/translated.s
go test ./...i候选版本;二进制尚未签名,API 和 ABI 仍可能调整。
不会做通用的 source-to-source 改写。c2go-clang 编译 C,c2go-bind 再生成组成普通 Go package 所需的 .go 与 .s 文件。
不需要。生成阶段需要 C2Go SDK,但消费者可以在 CGO_ENABLED=0、没有宿主 C 编译器的环境中构建。
当前候选版本面向 C,不支持 C++;发布页提供 Linux amd64/arm64、Windows amd64 与 macOS arm64 SDK。采用前应核对语言、ABI、回调和栈指针限制。
当前发布仍是 pre-1.0 候选版本,二进制尚未签名,API 与 ABI 也可能变化。它更适合评估、兼容性验证和受控迁移。
从一个 C 加法函数开始,逐步理解 Go GC 管理的内存、互操作和多文件构建。
开始使用