本文详解 go 与 c 互操作中“从 c 调用 go 函数”的常见编译错误(如 conflicting types for ‘dummy’),并提供结构清晰、可复现的解决方案,涵盖头文件分离、导出规范、cgo 编译约束等关键实践。
在 Go 中通过 //export 声明函数供 C 调用,是 cgo 的核心能力之一。但初学者常因 C 侧声明与 Go 导出不匹配而遭遇编译失败——典型报错如:
error: conflicting types for ‘dummy’ note: previous declaration of ‘dummy’ was here
该错误本质是 C 编译器在多个位置看到对同一符号 dummy 的不一致声明:Go 的 cgo 自动生成的 _cgo_export.c 文件中已声明 int dummy(void)(由 //export dummy 推导),而你在 wrapper.c 中又手动写了 extern int dummy(); ——若两者签名不严格一致(例如返回值、参数列表、调用约定),GCC 就会拒绝编译。
✅ 正确做法是:C 侧只声明接口(头文件),不重复声明 Go 导出函数;让 cgo 全权负责符号链接。