Linux for Windows上的交叉编译扩展 [英] Cross-compile extension on Linux for Windows

查看:23
本文介绍了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 seta whole exciting new set

我的感觉是,任何可行的解决方案都可能基于这些基本正常工作的Windows版Mingw编译器。

这篇关于Linux for Windows上的交叉编译扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆