6.Cython使用WinGw编译pyd

前言

以前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步骤从新编译一次

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿飞哥666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值