Linux for Windows上的交叉编译扩展

Cross-compile extension on Linux for Windows(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代码...我观察了setuptoolsdistutilscython优雅的相互作用的深渊,在深渊有机会回顾我之前……有没有办法只指定一些标志..。例如编译器的名称和所需平台的Python二进制文件以及...它会这么做吗?

我读过这篇文章:http://whatschrisdoing.com/blog/2009/10/16/cross-compiling-python-extensions/--快10年了。这让我很想哭。写完之后有什么变化吗?或者这些步骤或多或少是我必须为我正在运行的平台以外的平台进行编译所做的工作?

或者,网络上有没有这样做的示例项目?

目标

我的最终目标是生成一个egg包,它将包含PE和ELF二进制文件,并在通过pippipenv安装时将它们安装在任何一个平台上的正确位置。它应该在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上的交叉编译扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)