Cython生成多C文件编译报错:__pyx_CommonTypesMetaclass_get_module重定义
编译Cython生成的C文件时出现"multiple definitions of '__pyx_CommonTypesMetaclass_get_module'"错误
问题背景
我用Cython将多个Python文件转换为多个C文件,再通过GCC编译。在Ubuntu 22.04搭配Python3.10的环境中流程运行正常,但切换到Kubuntu 20.04搭配Python3.8的环境时,编译失败,报错信息:
multiple definitions of '__pyx_CommonTypesMetaclass_get_module'
已在Kubuntu机器上重新生成C文件,两台机器使用的Cython版本分别为:
- Ubuntu 22.04:0.29.37
- Kubuntu 20.04:3.1.2
可能的原因及解决办法
1. Cython版本差异导致符号重复定义
Cython 3.x(如3.1.2)相比旧版本(0.29.37)的代码生成逻辑有变化,__pyx_CommonTypesMetaclass_get_module这类公共辅助函数会被生成到每个C文件中,而非旧版本仅在单个文件生成。当编译多个C文件并链接时,就会触发重复定义错误。
2. 编译/链接策略需要调整
针对Cython 3.x环境,需适配编译方式:
- 尝试将所有C文件一次性编译链接,比如执行:
gcc -o output *.c $(python3-config --cflags --ldflags) - 分步编译时,给每个C文件添加
-fPIC参数生成位置无关代码,再进行链接,避免符号冲突 - 检查Cython模块结构,排查是否存在多个文件重复声明相同元类或公共类型的情况
3. Python版本兼容性问题
Python3.8与3.10的C API存在细微差异,Cython 3.x针对新版本Python做了优化,在旧版本Python下生成的代码可能存在兼容问题:
- 在Kubuntu 20.04上降级Cython到0.29.x系列,与Ubuntu 22.04版本对齐,验证是否解决问题
- 调整Cython编译选项,通过
cythonize的compiler_directives配置添加针对Python3.8的特定参数
内容的提问来源于stack exchange,提问作者Simon T.
相关产品推荐
相关产品推荐

