交叉编译Python到ARM时出现错误

9

我正在尝试为ARM编译Python(版本3.1.3),按照这篇指南的说明进行操作。

以下是我在Ubuntu 12上执行的命令:

CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ AR=arm-linux-gnueabi-ar RANLIB=arm-linux-gnueabi-ranlib ./configure --host --build=x86_64-linux-gnu --prefix=/python

make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-linux-gnueabi- CROSS_COMPILE_TARGET=yes HOSTARCH=x86_64-linux-gnu BUILDARCH=x86_64-linux-gnu

make install HOSTPYTHON=./hostpython BLDSHARED="arm-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-linux-gnueabi- CROSS_COMPILE_TARGET=yes prefix=~/Python-2.7.2/_install

注意以下几点:
  1. 当执行第一条命令时,如果 --host 设为 arm-linux,命令将不会执行,并提示我应该使用“--host”进行交叉编译。这就是为什么我没有设置它的原因。
  2. 运行第二行时,我得到如下信息:

configure: 警告:缓存变量ac_cv_host包含换行符。
无法配置ctypes模块

Python构建完成,但未找到构建以下模块所需的必要组件:
_curses _curses_panel _dbm
_gdbm _hashlib _sqlite3
_ssl bz2 ossaudiodev readline zlib
若要查找必要组件,请查看setup.py中detect_modules()函数,并查找相应模块的名称。

以下模块构建失败:
_tkinter

在运行第三行命令时,我遇到了类似的错误,但我想这是因为上面的命令没有起作用造成的。

我正在寻求帮助来解决这个问题。


1
我并不是专家,但上一次在ARM上进行交叉编译(针对QNX操作系统)时,./configure步骤需要指定--target和--host。如果指定--target = arm-linux和--host = arm-linux,那么--host错误是否会消失? - user44484
3
我觉得ARM编译器找不到用于编译扩展模块(_curses、_ssl、bz2等)所需的头文件。或者库文件找不到...它们不是编译器的一部分。因此,在任何情况下,您都需要从源代码构建所有这些适用于ARM的库(并告诉Python构建它们的位置),或者配置Python跳过那些模块。 - greggo
3
如果我可以建议回溯一下,相对于交叉编译而言,在运行中的ARM系统上进行本地编译会更容易。为此,我喜欢在QEMU中进行ARM软件构建。以下是一个快速入门指南:http://xecdesign.com/qemu-emulating-raspberry-pi-the-easy-way/ - Joshua D. Boyd
你也可以像使用qemubuilder一样在用户模式下使用QEMU,以比使用全面的QEMU系统模式设置更快的跨本地构建环境。 - Jerry Hicks
显示剩余8条评论
2个回答

1

QEMU 下本地编译比交叉编译要容易得多。

从任何你喜欢的项目中解压出一个 arm chroot,例如 arch linux arm、raspbian 等。

你已经获得了适用于 arm 的二进制 python,但如果你真的想自己编译:

下载 qemu-user-static(例如 debian 包),并解压。

将该单个静态二进制文件安装到你的 arm chroot 的根目录下。

在 proc 中添加魔术十六进制数到 binfmt。DebianGentoogenricList of magic hex sequences 提供了指令。以下是我的设置:

mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register
export QEMU_CPU=arm926

根据需要,可以选择使用mount --bind命令挂载/tmp、/proc、/sys等目录。

祝您在虚拟环境中愉快!


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接