使用cgo调用C库时出现undefined reference错误求助
问题分析
错误提示undefined reference to 'my_function'说明:编译器能识别头文件里的函数声明(没有报找不到lib.h的错误),但链接阶段找不到该函数的二进制实现代码——你只告诉Go函数的“名字”,没告诉它去哪里找函数的实际执行代码。
解决步骤
1. 确认C库实现文件存在
首先确保你有包含my_function实现的.c源文件,比如:
// 示例:./src/lib/lib.c #include "../include/lib.h" void my_function() { // 这里是函数的具体实现代码 }
2. 编译C代码为库文件
把C代码编译成静态库或动态库,让Go在链接时能定位到实现:
编译静态库
# 进入C代码所在目录(示例为./src/lib) cd ./src/lib # 编译生成目标文件 gcc -c lib.c -o lib.o # 打包成静态库 ar rcs libmylib.a lib.o
或编译动态库
cd ./src/lib gcc -shared -fPIC lib.c -o libmylib.so
3. 修改Go代码,添加cgo链接指令
在Go的cgo注释块开头,加入#cgo指令,指定库文件的路径和名称:
package main /* #cgo LDFLAGS: -L./src/lib -lmylib #include <stdlib.h> #include "./src/include/lib.h" */ import "C" import "unsafe" func main() { C.my_function() }
-L./src/lib:告诉编译器去哪里找库文件-lmylib:指定要链接的库——对应静态库libmylib.a或动态库libmylib.so,规则是去掉前缀lib和后缀.a/.so
4. 运行Go程序
- 如果用静态库,直接执行:
go run main.go - 如果用动态库,需要先让系统找到动态库路径:
export LD_LIBRARY_PATH=./src/lib:$LD_LIBRARY_PATH go run main.go
额外排查点
- 检查函数声明与实现的一致性:头文件里
my_function的参数、返回值类型,必须和.c文件里的实现完全匹配 - 如果是第三方预编译库,确认库文件是对应架构(比如amd64)的版本,路径和名称无误
- 确保
#cgo指令放在#include之前,且注释块和import "C"之间没有空行
内容的提问来源于stack exchange,提问作者XXfedeXX
相关产品推荐
相关产品推荐

