Cross-compile extension on Linux for Windows(Linux for Windows上的交叉编译扩展)
问题描述
我已经设法使用MinGW在Linux上构建了我的Python扩展所必需的一些DLL。大致是这样的:
from setuptools.command.build_py import build_py
class BuildGo(build_py):
def run(self):
if # need to build windows binaries
self.build_win()
build_py.run(self)
def build_win(self):
if # compilers and toolchain available
try:
# builds extra libraries necessary for this extension
except subprocess.CalledProcessError as e:
print(e.stderr)
raise
try:
result = subprocess.check_output([
'x86_64-w64-mingw32-gcc-win32',
'-shared',
'-pthread',
'-o',
EXTRA_DLL,
FAKE_WIN_BINDINGS,
ARCHIVE_GENERATED_IN_PREVIOUS_STEP,
'-lwinmm',
'-lntdll',
'-lws2_32',
])
print(result)
except subprocess.CalledProcessError as e:
print(e.stderr)
raise
我现在希望我可以避免以同样痛苦的方式扩展build_ext
,让它交叉编译适用于Windows的Cython代码...我观察了setuptools
、distutils
和cython
优雅的相互作用的深渊,在深渊有机会回顾我之前……有没有办法只指定一些标志..。例如编译器的名称和所需平台的Python二进制文件以及...它会这么做吗?
我读过这篇文章:http://whatschrisdoing.com/blog/2009/10/16/cross-compiling-python-extensions/--快10年了。这让我很想哭。写完之后有什么变化吗?或者这些步骤或多或少是我必须为我正在运行的平台以外的平台进行编译所做的工作?
或者,网络上有没有这样做的示例项目?
目标
我的最终目标是生成一个egg
包,它将包含PE和ELF二进制文件,并在通过pip
或pipenv
安装时将它们安装在任何一个平台上的正确位置。它应该在Linux上编译(不需要在MS Windows上编译)。
推荐答案
我将此发布为社区维基,因为这是一个非常不令人满意的答案:它只告诉您为什么它非常困难,而不是提供真正的解决方案。
Windows上的官方Python发行版是compiled with Microsoft Visual C (MSVC),在编译Python扩展时,通常需要使用与编译时使用的版本相同的版本。这表明精确的编译器匹配非常重要。可以获得使用Mingw编译的Python版本,然后这些版本将与使用Mingw编译的模块兼容。这可能可以作为Linux上的交叉编译器工作,但这些模块只对拥有此自定义版本的一小部分人有用(因此无助于创建有用的、可分发的.egg文件)。
https://mingwpy.github.io/(我想也是https://anaconda.org/msys2/m2w64-toolchain),我们已经做出了合理的努力来开发一个可以在Windows上构建兼容的Python扩展的Mingw版本。这一问题的主要驱动因素似乎是缺乏与MSVC兼容的Windows版免费Fortran编译器,因此构建Fortran模块的能力非常有用。在我的经验中,mingwpy工具链运行得很好,直到切换到更新版本的MSVC带来了a whole exciting new set的a whole exciting new set。我的感觉是,任何可行的解决方案都可能基于这些基本正常工作的Windows版Mingw编译器。
这篇关于Linux for Windows上的交叉编译扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Linux for Windows上的交叉编译扩展
基础教程推荐
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01