为树莓派交叉编译Python代码

3
我发现在我的Ubuntu 19.04 64位机器上安装交叉编译器时出了问题。我想将Python代码交叉编译为可执行文件,以便在运行Debian Stretch的树莓派3型B+上使用。我遵循了许多指南,但没有一个有效。实际上,我正在按照https://github.com/Yadoms/yadoms/wiki/Cross-compile-for-raspberry-PI的步骤进行操作。
我遵循了上述指南的步骤: - 设置环境 - 安装交叉编译器 - Boost 1.64 - Python
在最后一部分(Python)中,它无法执行最后一条指令。
$ CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ AR=arm-linux-gnueabihf-ar RANLIB=arm-linux-gnueabihf-ranlib ./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --build=x86_64-linux-gnu --prefix=$HOME/Desktop/rapsberry/depsBuild/python --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no ac_cv_have_long_long_format=yes --enable-shared

输出:

checking build system type... x86_64-pc-linux-gnu
checking host system type... arm-unknown-linux-gnueabihf
checking for python3.7... python3.7
checking for python interpreter for cross build... python3.7
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... checking for --without-gcc... no
checking for --with-icc... no
checking for arm-linux-gnueabihf-gcc... arm-linux-gnueabihf-gcc
checking whether the C compiler works... no
configure: error: in `/home/slr/Desktop/raspberry/boost_1_64_0/Python-3.7.5':
configure: error: C compiler cannot create executables
See `config.log' for more details

然后:
$ make HOSTPYTHON=$HOME/Desktop/raspberry/depsBuild/pythonhost/python HOSTPGEN=$HOME/Desktop/raspberry/depsBuild/pythonhost/Parser/pgen BLDSHARED="arm-linux-gnueabihf-gcc -shared" CROSS-COMPILE=arm-linux-gnueabihf- CROSS_COMPILE_TARGET=yes HOSTARCH=arm-linux BUILDARCH=arm-linux-gnueabihf 

输出:

 make: *** No targets specified and no makefile found.  Stop.

我需要使用 Python3 实现我的目的。
我在这个问题上遇到了困难,有人可以提供一些想法吗?我尝试过 QEMU 和 Docker (https://raspberrypi.stackexchange.com/questions/109488/building-a-virtual-machine-with-the-img-file-of-the-raspberry-pi-stretch),但都无法编译我的目标代码: gcc: 内部编译器错误 我的代码很长(几千行),而小型代码成功运行。谢谢提前。
1个回答

2
您使用的工具链或调用Python配置脚本的方式似乎存在问题。
无论哪种情况,如果不看到您的确切设置,就无法进行调试,因此我将从头开始。
我正在记录一个类似的项目:树莓派C++开发

工具链

raspberrypi/tools 存储库中的工具链相当古老。 我通常使用Cross tool-NG构建一个新的工具链(这也是raspberrypi/tools 工具链的构建方式,如果我没有记错的话)。
我使用了 armv8-rpi3-linux-gnueabihf 示例

当然,您也可以自行构建它,但这可能需要相当长的时间,因此您还可以从Docker Hub下载我构建的工具链(稍后详细介绍)。

你可以在这里找到有关如何构建它的更多信息:有关配置和构建工具链的详细信息

为构建系统编译Python

为了交叉编译Python模块,您需要两个相同版本的Python:一次用于构建系统(正在构建的计算机),一次用于主机系统(正在为其构建的树莓派)。
两者都将从源代码编译,以确保它们是完全相同的版本。
构建Python仅用于交叉编译主机Python,因此我们不会启用优化和可选模块。
这是我使用的脚本:python-build.sh
你需要OpenSSL、Zlib和libffi才能让pip正常工作。我也从源代码构建了它们,但你当然可以使用软件包管理器安装它们(你需要-dev版本)。
同样,你可以在这里找到我使用的安装脚本。

为主机系统交叉编译Python

在为树莓派交叉编译Python之前,您需要交叉编译其依赖项。详细的说明可以在这里找到: 交叉编译依赖项
您可以在我之前提到的GitHub相同文件夹中找到脚本,例如,python.sh
当进行交叉编译时,有一些注意事项,您需要一个正确前缀的pkg-config,它在您的交叉编译sysroot中查找所需库,而不是在您的构建系统的库文件夹中查找。在调用配置脚本时,还必须指定包含目录和库文件夹。
所有这些都由此Dockerfile和相同文件夹中的脚本处理。

Crossenv

使用Crossenv是交叉编译Python模块最简单的方法。具体指南可以在GitHub页面的README中找到。

一切准备就绪后,您可以运行python setup.py bdist_wheel

示例

以编译一个简单的Cython Python模块为例,您可以按照以下步骤进行:

1. 从Docker Hub拉取工具链和交叉编译的Python

这是一个包含交叉编译工具链、本机和交叉编译的Python以及Crossenv的镜像。

docker pull tttapa/rpi3-armv8-python-opencv-cross

2. 创建Python文件并编写setup.py来构建它

创建这两个文件:

helloworld.py

print("Hello, World")

setup.py

from setuptools import setup
from Cython.Build import cythonize
from sys import version_info

setup(
    name='helloworld',
    version='0.0.1',
    ext_modules = cythonize("helloworld.py", language_level=version_info[0])
)

3. 创建一个脚本来构建Python模块

这个脚本将在Docker容器内运行。

build.sh

#!/usr/bin/env bash

set -e
cd /tmp/workdir
source "$HOME/crossenv/bin/activate"
build-pip install cython
cross-pip install wheel
python setup.py bdist_wheel

4. 启动Docker容器并构建模块

在创建了三个文件的同一文件夹中运行以下命令。

docker run --rm -v "$PWD:/tmp/workdir" \
    tttapa/rpi3-armv8-python-opencv-cross \
    bash "/tmp/workdir/build.sh"

当编译完成后,您会在文件夹dist中找到一个名为的文件。您可以使用pip install helloworld-0.0.1-cp38-cp38-linux_arm.whl在Raspberry Py上安装它。您还会发现Cython生成的helloworld.c文件。
要运行它,您可能需要将交叉编译库和Python本身安装到RPi上。您可以通过将Docker容器中~/RPi-staging文件夹中的所有内容复制到Pi的根目录/中来实现此操作。

这个答案里有很多失效的链接,在2023年。不如看看这个仓库,里面有一个很棒的Docker构建:https://github.com/paleozogt/crossenv-example - Sean McCarthy

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