Ubuntu虚拟机交叉编译树莓派Python转C代码报错求助
解决树莓派RPi3 B+交叉编译Python相关C代码的问题
我之前也碰到过类似的交叉编译Python依赖代码到树莓派的坑,你遇到的Python.h和pyconfig.h找不到的问题,核心原因是你用了Ubuntu主机(x86架构)的Python头文件,而树莓派是ARM架构,两者的头文件(尤其是pyconfig.h,它是针对特定架构生成的)完全不兼容。下面给你几个可行的解决方案,按省心程度排序:
方案一:用Docker直接在ARM兼容环境编译(最推荐)
这个方法完全规避交叉编译的头文件适配问题,因为Docker镜像直接模拟了树莓派的ARM环境:
- 先确保你的Ubuntu虚拟机安装了Docker
- 拉取适配树莓派3的Python镜像:
docker pull arm32v7/python:3.5-slim - 将你的代码目录挂载到容器中,直接在容器内编译:
编译完成后,当前目录下的docker run -v $(pwd):/app -w /app arm32v7/python:3.5-slim bash -c "apt-get update && apt-get install -y gcc && gcc -I/usr/include/python3.5m -L/usr/lib/python3.5/config-3.5m-arm-linux-gnueabihf -lpython3.5m -o test test.c"test就是可以直接在树莓派上运行的可执行文件。
方案二:使用树莓派官方交叉工具链+拷贝树莓派原生头文件
如果不想用Docker,可以手动配置交叉编译环境,关键是要拿到树莓派原生的Python头文件和库:
- 安装树莓派官方的ARM交叉编译工具链:
git clone https://github.com/raspberrypi/tools.git ~/rpi-tools export PATH=$PATH:~/rpi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin - 从你的树莓派上拷贝ARM架构的Python头文件和配置文件(假设树莓派IP是
192.168.1.100,用户名为pi):# 拷贝Python头文件目录 scp -r pi@192.168.1.100:/usr/include/python3.5m/ ~/rpi-python-include/ # 拷贝Python配置目录(包含pyconfig.h) scp -r pi@192.168.1.100:/usr/lib/python3.5/config-3.5m-arm-linux-gnueabihf/ ~/rpi-python-config/ - 使用交叉工具链编译,指定树莓派的头文件和库路径:
arm-linux-gnueabihf-gcc -I~/rpi-python-include/ -I~/rpi-python-config/ -L~/rpi-python-config/ -lpython3.5m -o test test.c
方案三:适配Cython的交叉编译流程
如果你想继续用Cython转C的流程,只需要把生成的C代码用上面的交叉工具链编译即可:
- 先在Ubuntu主机上用Cython生成C代码:
cython --embed your_script.py -o your_script.c - 然后用方案二中的交叉工具链和树莓派头文件编译:
arm-linux-gnueabihf-gcc -I~/rpi-python-include/ -I~/rpi-python-config/ -L~/rpi-python-config/ -lpython3.5m -o your_script your_script.c
为什么之前的方法失败?
你之前用-I/usr/include/python3.5指定的是Ubuntu主机x86架构的Python头文件,其中的pyconfig.h包含了x86特有的编译宏和路径,完全不适用于ARM架构的树莓派,所以即使你找到了文件,后续也会出现大量编译错误。必须使用树莓派原生的ARM版本头文件才能正常编译。
内容的提问来源于stack exchange,提问作者Leo94
相关产品推荐
相关产品推荐

