使用cython将项目从intel ubuntu交叉到arm

osg*_*sgx 9 python gcc cross-compiling cython

我在我的ubuntu 16 x86_64上有简单的python + cython项目(来自http://docs.cython.org/src/tutorial/cython_tutorial.html的 hello world示例).我可以使用cython for x86_64构建这个项目.

如何在不使用真正的armv7板/ cpu的情况下为armv7版本的ubuntu 15构建项目?

我有arm-linux-gnueabihf-gcc(http://packages.ubuntu.com/xenial/devel/gcc-arm-linux-gnueabihf)它可以为armv7编译简单的C程序.如何更改cython的设置以使用交叉编译器为arm构建共享对象?

J.J*_*ala 8

交叉编译需要架构相关的库和头文件.

在测试是否python3.5-dev软件包和其他人可以后安装dpkg --add-architecture armhf和apt-get update(经过一番修改的sources.list),结果基本相符.

python3.5-dev:armhf : Depends: python3.5:armhf (= 3.5.1-10) but it is not going to be installed
Run Code Online (Sandbox Code Playgroud)

apt-get install python3.5:armhf是不起作用的东西,请参阅

现有的提议允许为不同的体系结构共同安装库和头文件,但不包括(尚未)二进制文件.

QEMU和chroot提供了一种不需要"完整"虚拟机的可能解决方案.可以通过debootstrap命令创建合适的chroot目录.创建后,schroot可以提供对该环境的访问权限.

替换<DIRECTORY>并<USER>在以下命令中:

apt-get install -y debootstrap qemu-user-static binfmt-support schroot
debootstrap --arch=armhf --foreign --include=gcc,g++,python3.5-dev xenial <DIRECTORY>
cp /usr/bin/qemu-arm-static <DIRECTORY>/usr/bin
chroot <DIRECTORY>
/debootstrap/debootstrap --second-stage
echo "deb http://ports.ubuntu.com/ubuntu-ports xenial universe" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com/ubuntu-ports xenial multiverse" >> /etc/apt/sources.list
apt-get update
apt-get install -y cython cython3
exit
cat <<END > /etc/schroot/chroot.d/xenial-armhf
[xenial-armhf]
description=Ubuntu xenial armhf
type=directory
directory=/home/xenial-armhf
groups=sbuild,root
root-groups=sbuild,root
users=root,<USER>
END
Run Code Online (Sandbox Code Playgroud)

应该可以访问环境

schroot -c chroot:xenial-armhf
Run Code Online (Sandbox Code Playgroud)

对于root用户会话(用户必须在根组中列出的组中),

schroot -c chroot:xenial-armhf -u root
Run Code Online (Sandbox Code Playgroud)

在此之后,还可以交叉编译cython模块:

hello.pyx:

print("hello world")
Run Code Online (Sandbox Code Playgroud)

编译(python3.5-config --cflags并python3.5-config --libs在chroot中选项,注意-fPIC):

cython hello.pyx
arm-linux-gnueabihf-gcc --sysroot <DIRECTORY> -I/usr/include/python3.5m -I/usr/include/python3.5m  -Wno-unused-result -Wsign-compare -g -fstack-protector-strong -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -c hello.c
arm-linux-gnueabihf-gcc --shared --sysroot <DIRECTORY> -lpython3.5m -lpthread -ldl  -lutil -lm hello.o -o hello.so
Run Code Online (Sandbox Code Playgroud)

然后可以测试该模块

schroot -c chroot:xenial-armhf
python3
import hello
Run Code Online (Sandbox Code Playgroud)

交叉编译基于cython的python模块也可以工作.使用setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

import os

os.environ['CC'] = 'arm-linux-gnueabihf-gcc'
os.environ['LDSHARED'] = 'arm-linux-gnueabihf-gcc -shared'
sysroot_args=['--sysroot', '/path/to/xenial-armhf']

setup(cmdclass = {'build_ext': build_ext},
      ext_modules= [ Extension("hello", ["hello.pyx"],
                                extra_compile_args=sysroot_args,
                                extra_link_args=sysroot_args) ])
Run Code Online (Sandbox Code Playgroud)

hello world这种方式可以构建一个简单的模块.该模块的文件名是错误的,在这种情况下它是hello.cpython-35m-x86_64-linux-gnu.so.重命名后hello.so,可以导入它.