我有一个用C编写的大型项目,我编写了一个Go脚本,该脚本具有要从C代码( C-> Go )中调用的功能。此相同的Go函数还需要调用某些C函数( Go-> C )。
这里是项目结构的简化视图:
- src/...
- src/file_c.h
- src/file_c.c
- src/gocode/file_go.go
- src/Makefile
这是我想做的事情:
file_c.c
需要包含file_go.h
(C-> Go)。file_go.go
需要包含file_c.h
(Go-> C)。在文件file_go.go
中,在import "C"
语句之前,我添加了以下几行:
// #cgo CFLAGS: -I..
// #include "file_c.h"
然后我尝试使用两个命令编译file_go.go
:
go build -buildmode=c-shared file_go.go
go build -buildmode=c-archive file_go.go
但是,在两种情况下,我都得到了undefined reference to func
类型的错误消息,其中func
是C函数(在file_c.h
中声明并在file_c.c
中定义)从Go代码。
如果我从file_go.go
中的Go-> C中删除了调用,那么它将正确编译,并且可以在C Makefile中正确包含file_go.h
。但是,我也需要Go文件来调用该C函数。
如何以正确链接C函数的方式构建Go文件?