如何将Go静态库链接到C程序?链接时遇函数未定义报错
解决C调用Go函数时的未定义引用问题
问题根源
你手动编写的binding.h未包含Go生成的必要声明,编译时缺少Go运行时依赖的系统库链接参数,同时链接库的顺序也会导致符号无法被正确解析。
修复步骤
替换为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(); }修正编译命令
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确认Go代码导出格式
你的Go代码中// export goCallbackHandler注释紧贴函数定义,格式符合要求,这部分无需修改。
原理说明
Go编译为C静态库时,自动生成的头文件包含了导出函数的规范声明和运行时初始化逻辑,手动编写的头文件会缺失这些关键内容。另外Go运行时依赖多线程、动态链接等系统能力,必须显式链接对应库才能正常解析符号。
内容的提问来源于stack exchange,提问作者MrMcGoats
相关产品推荐
相关产品推荐

