在嵌入式ARM 64位设备上开发GUI应用时,PyQt5是个非常不错的选择。但实际操作中你会发现,直接用pip安装PyQt5经常会遇到各种问题。这是因为PyPI官方源没有提供ARM架构的预编译wheel包,导致pip安装时会在本地尝试编译,而这个过程往往因为缺少依赖或环境配置问题而失败。
我曾在RK3399开发板上尝试过直接pip安装,结果编译了半小时后报错退出。后来发现系统自带的apt安装方式也有坑——它会将PyQt5安装到系统Python目录,导致虚拟环境无法调用。这就是为什么我们需要掌握源码编译的方法,它能解决三个关键问题:
提示:建议从Riverbank官网下载源码包,避免使用pip自动下载的版本,后者可能存在版本不匹配问题。
我测试过的设备包括:
这些设备的共同点是:
以Ubuntu 18.04为例,这些依赖必不可少:
bash复制sudo apt update
sudo apt install -y \
build-essential \
python3-dev \
qt5-default \
qttools5-dev-tools \
libqt5svg5-dev \
libqt5webkit5-dev \
libqt5x11extras5-dev
关键组件说明:
验证qmake是否就绪:
bash复制qmake --version
# 应输出类似:QMake version 3.1
从官网下载对应版本(以4.19.25为例):
bash复制wget https://www.riverbankcomputing.com/static/Downloads/sip/4.19.25/sip-4.19.25.tar.gz
tar xvf sip-4.19.25.tar.gz
cd sip-4.19.25
关键配置选项:
bash复制python configure.py \
--sip-module=PyQt5.sip \
--sysroot=/usr \
--no-tools
参数含义:
--sysroot:指定系统根目录--no-tools:跳过生成sip命令行工具执行编译(建议使用-j参数加速):
bash复制make -j$(nproc)
sudo make install
安装后检查:
python复制import sip
print(sip.SIP_VERSION_STR)
# 应输出4.19.25
下载PyQt5 5.15.2源码:
bash复制wget https://www.riverbankcomputing.com/static/Downloads/PyQt5/5.15.2/PyQt5-5.15.2.tar.gz
tar xvf PyQt5-5.15.2.tar.gz
cd PyQt5-5.15.2
运行configure时注意:
bash复制python configure.py \
--confirm-license \
--qmake /usr/lib/qt5/bin/qmake \
--disable=QtNfc \
--disable=QtBluetooth
常见问题处理:
--no-designer-plugin减少编译目标使用并行编译:
bash复制make -j$(($(nproc)-1)) # 留一个核心给系统
内存不足时的解决方案:
bash复制sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
将编译产物打包到虚拟环境:
bash复制# 在系统目录打包
tar czf pyqt5.tar.gz /usr/lib/python3/dist-packages/PyQt5/
# 解压到虚拟环境
tar xzf pyqt5.tar.gz -C ~/venv/lib/python3.7/site-packages/
创建.pth文件解决导入问题:
bash复制echo "/home/pi/venv/lib/python3.7/site-packages/PyQt5" > \
~/venv/lib/python3.7/site-packages/pyqt5.pth
创建test_qt.py:
python复制import sys
from PyQt5.QtWidgets import QApplication, QLabel
app = QApplication(sys.argv)
label = QLabel("Hello ARM64!")
label.show()
sys.exit(app.exec_())
运行测试:
bash复制source ~/venv/bin/activate
python test_qt.py
问题1:undefined reference to `PySlice_Unpack'
解决方案:升级Python到3.7+版本
问题2:qmake版本不匹配
处理方法:
bash复制export QT_SELECT=qt5
qmake -v
ImportError: libQt5Core.so.5 not found
解决方法:
bash复制export LD_LIBRARY_PATH=/usr/lib/aarch64-linux-gnu
在~/.bashrc中添加:
bash复制export QT_QUICK_BACKEND=software
export QT_QPA_PLATFORM=offscreen
只编译必要模块:
bash复制python configure.py --modules="QtCore QtGui QtWidgets"
在x86主机上配置交叉编译:
bash复制export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
使用Docker多阶段构建:
dockerfile复制FROM arm64v8/ubuntu as builder
# 编译步骤...
FROM arm64v8/python:3.7
COPY --from=builder /output /usr/local
在智能家居控制面板项目中,我通过源码编译实现了这些优化:
关键编译参数:
bash复制export CFLAGS="-mcpu=cortex-a53 -O3 -pipe"
export CXXFLAGS="$CFLAGS"
测试效果对比: