Ubuntu下用Cython+MinGW64编译pyx为exe报错求助
WSL Ubuntu下Cython交叉编译生成Windows EXE解决方案
问题根源
直接调用x86_64-w64-mingw32-gcc时,你用了Linux版的python3-config获取编译参数,这会指向WSL内的Linux Python环境,而非Windows Python。同时缺少Windows平台的宏定义,导致SIZEOF_WCHAR_T未定义等错误。以下是分步解决办法:
1. 安装必要工具
先确保交叉编译工具和依赖齐全:
sudo apt update && sudo apt install gcc-mingw-w64-x86-64 python3-dev python3-pip pip install cython
2. 调整代码结构(生成独立EXE必备)
在qrawler.pyx末尾添加主函数入口,让Cython能嵌入Python解释器:
def main(): # 把你原来的主程序逻辑放到这里 pass if __name__ == "__main__": main()
3. 准备Windows Python环境文件
因为要交叉编译Windows程序,需要Windows版Python的头文件和库:
- 从Python官网下载对应版本的Windows嵌入包(64位,和你WSL里的Python版本尽量一致)
- 解压到WSL的某个目录,比如
~/win-python,解压后会有include(头文件)和libs(库文件)两个目录
4. 直接编译生成EXE
先通过Cython生成带嵌入解释器的C文件:
cython --embed -3 qrawler.pyx
然后用mingw编译,指定Windows Python的路径和缺失的宏定义:
x86_64-w64-mingw32-gcc -o qrawler.exe qrawler.c \ -I~/win-python/include \ -L~/win-python/libs \ -lpython311 \ # 替换成你的Python版本,比如python310对应3.10 -DMS_WIN64 \ -DSIZEOF_WCHAR_T=2
5. 处理第三方依赖(Selenium、Firebase等)
编译后的EXE需要依赖库的支持,有两种方式:
- 方式一:打包依赖文件
把Selenium、Firebase等库的Python文件复制到EXE所在目录,同时确保Windows端有ChromeDriver等Selenium依赖。 - 方式二:用PyInstaller打包(更简便)
先把pyx编译成本地扩展,再用PyInstaller打包成独立EXE:# 编译pyx为pyd文件 python setup.py build_ext --inplace --compiler=mingw32 # 用PyInstaller打包(自动处理依赖) pyinstaller --onefile --noconsole --target-architecture=amd64 qrawler.py
错误原因解析
pyconfig.h多架构位置未知:python3-config返回的是Linux Python的路径,交叉编译时必须指定Windows Python的头文件目录。未定义SIZEOF_WCHAR_T:Windows平台下wchar_t的大小固定为2字节,手动添加-DSIZEOF_WCHAR_T=2宏定义即可解决。
内容的提问来源于stack exchange,提问作者Kevy legit
相关产品推荐
相关产品推荐

