使用CGO构建Go程序时出现undefined reference错误求助
问题原因及解决方法
错误根源
你的main.go中,cgo的LDFLAGS仅指定了库的搜索路径-L${SRCDIR}/lib,但没有明确指定要链接的目标库,导致链接器找不到execute函数的具体实现。
修复步骤
1. 修正main.go的cgo编译参数
在LDFLAGS后追加-lcalc(因为归档库命名为libcalc.a,链接时遵循-l+库名前缀后部分的规则):
package main /* #cgo LDFLAGS: -L${SRCDIR}/lib -lcalc #cgo CFLAGS: -I${SRCDIR}/include #include "calc.h" */ import "C" func main() { C.execute() }
注:由于CFLAGS已经指定了include目录,#include直接写calc.h即可,原写法include/calc.h也能生效,但更简洁的方式是直接引用头文件名。
2. 重新构建Go程序
执行构建命令:
go build main.go
此时链接器会在lib目录下找到libcalc.a,并正确链接其中的execute函数实现。
可选验证项
如果问题仍存在,可检查以下两点:
- 确认
execute.c中确实实现了execute()函数,且函数签名与calc.h中的声明完全一致(无拼写错误、参数/返回值匹配) - 验证归档库中包含目标符号,执行命令:
nm lib/libcalc.a | grep execute
若输出包含T execute,说明execute函数符号已正确存入归档库。
内容的提问来源于stack exchange,提问作者kelsonic
相关产品推荐
相关产品推荐

