Go调用Cython共享库出现未定义引用错误,无法构建程序
解决Go调用Cython生成共享库时的未定义引用问题
问题出在Cython代码的导出方式和编译参数上:直接用--embed生成的C代码中,add函数并没有以标准C函数的形式暴露,而是被Cython封装为Python可调用的内部函数,导致Go链接时找不到add符号。以下是修复步骤:
1. 修改Cython代码,导出标准C函数
更新add.pyx,使用cdef public声明要导出的C函数,确保Cython生成对外可见的符号:
#cython: language_level = 3 cdef public int add(int x, int y): return x + y
2. 重新生成C文件
移除--embed参数(该参数用于生成带Python解释器入口的可执行文件代码,不适合共享库场景):
cython -o add.c add.pyx
3. 编译生成共享库
保持原编译命令不变,重新生成libadd.so:
gcc -shared -pthread -fPIC -O2 -Wall -fno-strict-aliasing -o libadd.so add.c -I/usr/local/include/python3.10 -L/usr/local/lib/ -lpython3.10
4. 构建并运行Go程序
原main.go代码无需修改,构建后需指定共享库路径才能运行:
# 构建Go程序 go build -o main main.go # 运行(指定当前目录为共享库搜索路径) LD_LIBRARY_PATH=. ./main
执行后会输出5,符合预期。
内容的提问来源于stack exchange,提问作者user2480837
相关产品推荐
相关产品推荐

