使用GCC编译Cython生成的C文件出现未定义引用错误如何解决
报错原因
你遇到的是链接阶段符号缺失错误,根本原因如下:
- 仅通过
-L参数指定了库搜索路径,没有显式声明要链接Python核心运行时库,链接器无法解析_Py_Dealloc这类Python C API的符号 - 缺少
-shared编译参数,GCC默认会尝试生成可执行文件,而非Python可识别的.pyd扩展模块,符号匹配规则不符合扩展要求 - 原命令中的库搜索路径指向错误:
Python39/Lib目录存放的是Python标准库的.py源码,编译需要的C接口导入库存放在Python39/libs目录下 - 原命令末尾存在多余的无效反引号,会导致参数解析异常
修正后的编译命令
gcc -DSIZEOF_VOID_P=8 -DMS_WIN64 -shared csv.c ^ -I"C:\Users\rudz3\AppData\Local\Programs\Python\Python39\include" ^ -L"C:\Users\rudz3\AppData\Local\Programs\Python\Python39\libs" ^ -lpython39 -o csv.pyd
注:命令中的
^是Windows cmd下的换行符,如果你在msys2终端执行,把^换成反斜杠\即可,也可以把所有参数写在同一行。
修正点说明
- 新增
-shared参数,指定GCC生成动态链接库格式的Python扩展 - 将库搜索路径从
Lib改为libs,指向正确的导入库目录 - 新增
-lpython39参数,显式链接Python3.9的核心运行时库,解决符号缺失问题 - 新增
-o csv.pyd参数,指定输出的扩展模块文件名,生成后可直接在Python中执行import csv调用 - 移除原命令末尾多余的无效反引号
内容的提问来源于stack exchange,提问作者rudz33
相关产品推荐
相关产品推荐

