前言
以前Cython使用visual studio进行很顺利,突然这次安装系统之后,再次安装visual studio则安装不上去。提示需要下载某一些文件。后来思考再三使用WinGw进行编译。
提示:以下是本篇文章正文内容,下面案例可供参考
一、网上搜索资料
根据关键词搜索到两篇文章,看上去还算正宗
cython: 使用mingw编译器
Python 3.9,Cython,Mingw64 8.1.0生成PYD的一些坑
根据以上两篇文章终于配置成功。
二、核心步骤
2.1.安装WinGw
根据python、WinGw的位数要一致,例如64位;
下载可以搜索"Python踩坑之路-Python-3.6 安装pycrypto 2.6.1各种疑难杂"中提到的
解压到c盘下,之后加入到环境变量中path下
cmd执行:
gcc -v
检查是否生效、对应版本是否正确
也可参考“nuitka用于python打包”中讲了如何选择版本以及配置。
2.2.编译依赖库
把python36.dll和vcruntime140.dll转换为python36.a和vcruntime140.a
cmd命令:
gendef python38.dll
dlltool -D python38.dll -d python38.def -l libpython38.a
gendef vcruntime140.dll
dlltool -D vcruntime140.dll -d vcruntime140.def -l libvcruntime140.a
两个.a文件移动到“Python\Python38\libs”下
PS: dll文件在python根目录下
2.3.配置编译版本选择
修改Python38\Lib\distutils\cygwinccompiler.py大概位置在85行新增类似信息
elif msc_ver == '1900':
# Visual Studio 2015 / Visual C++ 14.0
# "msvcr140.dll no longer exists"
return ['vcruntime140']
elif msc_ver == '1928':
# Visual Studio 2015 / Visual C++ 14.0
# "msvcr140.dll no longer exists"
return ['vcruntime140']
提示:
1900/1928根据编译过程的错误提示进行新增
vcruntime140这个与前面依赖库的名称相关
2.4.指定编译器
编译过程错误提示:SystemExit: error: Unable to find vcvarsall.bat
在Python\Python39\Lib\distutils下新建文件distutils.cfg,内容为:
[build]
compiler=mingw32
[build_ext]
compiler=mingw32
PS:思考一下,这个mingw32是指32位系统编译吗?如果是的话,那么这个配置就应该替换32为64
2.5.编译参数
Cython编译python文件的默认方法为:
创建setup.py程序,进行pyd编译,之后调度方法位
python setup.py build_ext --inplace
使用WinGw进行编译,只要调度方法加入“ -DMS_WIN64 ”即可
python setup.py build_ext --inplace -DMS_WIN64
三、编译过程错误问题
3.1 Cython编译中的小问题
编译过程,遇到编译不过,需要重新修改代码才能够通过;
问题1:参数顺序问题;
最好调用函数的时候,不用要缺少参数,顺序不要改变,负责对打包结果(我用nuitka打包)后执行会报异常;
问题2:变量重构(重构描述可能不准确),举例:
args1 = { x:x for x args1 }
3.2 tinyaes安装提示’cannot find -lvcruntime140’
PS D:\tools\py32\tinyaes-1.0.2> python .\setup.py install
running install
running bdist_egg
running egg_info
writing tinyaes.egg-info\PKG-INFO
writing dependency_links to tinyaes.egg-info\dependency_links.txt
writing top-level names to tinyaes.egg-info\top_level.txt
reading manifest file 'tinyaes.egg-info\SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'tinyaes.egg-info\SOURCES.txt'
installing library code to build\bdist.win32\egg
running install_lib
running build_ext
building 'tinyaes' extension
C:\mingw32\bin\gcc.exe -mdll -O -Wall -Itiny-AES-c/ -IC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\include -IC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\include -c tinyaes.c -o build\temp.win32-3.8\Release\tinyaes.o
C:\mingw32\bin\gcc.exe -mdll -O -Wall -Itiny-AES-c/ -IC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\include -IC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\include -c tiny-AES-c/aes.c -o build\temp.win32-3.8\Release\tiny-aes-c\aes.o
writing build\temp.win32-3.8\Release\tinyaes.cp38-win32.def
C:\mingw32\bin\gcc.exe -shared -s build\temp.win32-3.8\Release\tinyaes.o build\temp.win32-3.8\Release\tiny-aes-c\aes.o build\temp.win32-3.8\Release\tinyaes.cp38-win32.def -LC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs -LC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\PCbuild\win32 -lpython38 -lvcruntime140 -o build\lib.win32-3.8\tinyaes.cp38-win32.pyd
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: skipping incompatible C:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs/libpython38.a when searching for -lpython38
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: skipping incompatible C:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs/libvcruntime140.a when searching for -lvcruntime140
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: skipping incompatible C:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs\libvcruntime140.a when searching for -lvcruntime140
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: skipping incompatible C:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs/libvcruntime140.a when searching for -lvcruntime140
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lvcruntime140
collect2.exe: error: ld returned 1 exit status
error: command 'C:\\mingw32\\bin\\gcc.exe' failed with exit status 1
PS D:\tools\py32\tinyaes-1.0.2>
PS D:\tools\py32\tinyaes-1.0.2> python .\setup.py install
running install
running bdist_egg
running egg_info
writing tinyaes.egg-info\PKG-INFO
writing dependency_links to tinyaes.egg-info\dependency_links.txt
writing top-level names to tinyaes.egg-info\top_level.txt
reading manifest file 'tinyaes.egg-info\SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'tinyaes.egg-info\SOURCES.txt'
installing library code to build\bdist.win32\egg
running install_lib
running build_ext
building 'tinyaes' extension
C:\mingw32\bin\gcc.exe -mdll -O -Wall -Itiny-AES-c/ -IC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\include -IC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\include -c tinyaes.c -o build\temp.win32-3.8\Release\tinyaes.o
C:\mingw32\bin\gcc.exe -mdll -O -Wall -Itiny-AES-c/ -IC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\include -IC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\include -c tiny-AES-c/aes.c -o build\temp.win32-3.8\Release\tiny-aes-c\aes.o
writing build\temp.win32-3.8\Release\tinyaes.cp38-win32.def
C:\mingw32\bin\gcc.exe -shared -s build\temp.win32-3.8\Release\tinyaes.o build\temp.win32-3.8\Release\tiny-aes-c\aes.o build\temp.win32-3.8\Release\tinyaes.cp38-win32.def -LC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs -LC:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\PCbuild\win32 -lpython38 -lvcruntime140 -o build\lib.win32-3.8\tinyaes.cp38-win32.pyd
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: skipping incompatible C:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs/libpython38.a when searching for -lpython38
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: skipping incompatible C:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs/libvcruntime140.a when searching for -lvcruntime140
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: skipping incompatible C:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs\libvcruntime140.a when searching for -lvcruntime140
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: skipping incompatible C:\Users\HYNSYH\AppData\Local\Programs\Python\Python38-32\libs/libvcruntime140.a when searching for -lvcruntime140
C:/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lvcruntime140
collect2.exe: error: ld returned 1 exit status
error: command 'C:\\mingw32\\bin\\gcc.exe' failed with exit status 1
根据提示,是libvcruntime140.a没有找到、但是再前面已经转换过到libs下;
解决办法:按照2.2步骤从新编译一次