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

如何将Go静态库链接到C程序?链接时遇函数未定义报错

解决C调用Go函数时的未定义引用问题

问题根源

你手动编写的binding.h未包含Go生成的必要声明,编译时缺少Go运行时依赖的系统库链接参数,同时链接库的顺序也会导致符号无法被正确解析。

修复步骤

  1. 替换为Go自动生成的头文件
    执行go build -o libhello.a -buildmode=c-archive hello.go后,会自动生成libhello.a和**hello.h**,这个头文件已经包含goCallbackHandler的正确声明,以及Go运行时初始化的必要代码。删除你自己的binding.h,修改main.c如下:

    #include "hello.h"
    
    int main() {
        return goCallbackHandler();
    }
    
  2. 修正编译命令
    GCC链接时需要将Go静态库放在源文件之后,同时必须链接Go运行时依赖的系统库(pthread、dl、rt),正确的编译命令为:

    gcc -o hello main.c libhello.a -pthread -ldl -lrt
    

    若使用-L指定库路径,需确保库参数放在最后:

    gcc -o hello main.c -L. -lhello -pthread -ldl -lrt
    
  3. 确认Go代码导出格式
    你的Go代码中// export goCallbackHandler注释紧贴函数定义,格式符合要求,这部分无需修改。

原理说明

Go编译为C静态库时,自动生成的头文件包含了导出函数的规范声明和运行时初始化逻辑,手动编写的头文件会缺失这些关键内容。另外Go运行时依赖多线程、动态链接等系统能力,必须显式链接对应库才能正常解析符号。

内容的提问来源于stack exchange,提问作者MrMcGoats

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:39:55