【问题标题】:How can I use python distutils to cross compile an extension module to a different architecture?如何使用 python distutils 将扩展模块交叉编译到不同的架构?
【发布时间】:2017-08-03 09:04:25
【问题描述】:

我正在使用 Cython 为我拥有的几个 python 模块生成已编译的 .so 文件。作为outlined in the Cython documentation,你可以创建一个setup.py文件如下:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize([
        'MyModule1.py',
        'MyModule2.py',
        'MyModule3.py'
    ])
)

然后使用命令python3 setup.py build_ext --inplace 构建模块。

这很好用,但是它会创建与主机架构相匹配的二进制文件(在我的例子中是 x86_64)。我想针对我已经拥有的交叉编译和环境的不同架构(armv7l)。用 python distutils 可以做到吗?

【问题讨论】:

  • 我认为最好的办法是运行具有仿真架构的虚拟机,并在本地提供所有工具。

标签: python cross-compiling cython distutils setup.py


【解决方案1】:

通过扩展上的extra_compile_args 传递替代march 和相关标志:

sources = ['MyModule1.py',
           'MyModule2.py',
           'MyModule3.py']

ext_modules=cythonize(sources,
                      extra_compile_args=['-march=armv7l'],
                      library_dirs=[<arm v7 libraries>],
                      include_path=[<arm v7 includes>])

需要适用于 armv7l 的构建工具链。

不过,基于 armv7l 的 linux 的 Docker 容器可能更易于使用,并且可以自动构建 arm。

As in 可以在脚本中运行 docker 容器构建并为您想要的所有架构和操作系统生成本机包。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2014-12-29
    • 2011-12-22
    相关资源
    最近更新 更多