在我的项目中,我使用回调进行从 C 到 go 的双向调用,反之亦然,使用 CGO。我通过将 C 部分编译到库中,然后将 go 部分编译到库中,然后最后的链接器传递将它们放在一起,解决了循环依赖的问题。这在不使用 go 模块时工作正常。Go 源文件明确列在命令行上。有人告诉我,从 go 1.12 开始“这不是正确的方法”。随着项目的发展,我现在想使用 go 模块。不幸的是,这改变了 go 编译器的行为。它现在想要解决外部依赖关系并将它们隐式包含在输出文件中。由于循环依赖,它现在总是以未定义的引用或多个定义结束。如何以“正确的方式”使用 cgo 和 go 模块时解决循环依赖关系?这是说明问题的最小示例。从 Makefile 中的调用中删除文件名“hello.go”以查看它是如何分崩离析的。这是错误消息:hello.c:3: multiple definition of `c_hello'; $WORK/b001/_cgo_hello.o:/tmp/go-build/hello.c:3: first defined here生成文件:libchello.a: Makefile hello.c gcc -fPIC -c -o chello.o hello.c ar r libchello.a chello.olibgohello.a: Makefile hello.go libchello.a env CGO_LDFLAGS=libchello.a go build -buildmode=c-archive -o libgohello.a hello.gomain: Makefile main.c libgohello.a libchello.a gcc -o main main.c libchello.a libgohello.a -pthread.PHONY: cleanclean: rm -f main *.a *.o echo "extern void go_hello();" > libgohello.h你好,去:package main/*extern void c_hello();*/import "C"import "time"import "fmt"//export go_hellofunc go_hello() { fmt.Printf("Hello from go\n") time.Sleep(1 * time.Second) C.c_hello()}func main() {}libgohello.h:extern void go_hello();你好ç:#include "libgohello.h"#include <stdio.h>void c_hello() { printf("Hello from c\n"); go_hello();}主.c:void c_hello();int main() { c_hello();}去.mod:module hehoe.de/cgocircular
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报
0/150
提交
取消