You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:56:04