python qt 程序移植到arm64平台
1、安装python环境 直接安装miniforge3,然后创建python3.8.20的虚拟环境,都有对应的arm版本。PyQt=5.15.10 Qt=5.15.10 这俩版本一定要一致。sip=6.8.6
2、安装PyQt5,没有对应的arm版本,需要源码编译
下载PyQt5源码,从https://pypi.org/上下载
python configure.py 编译
提示找不到命令sip
pip install sip 成功 还是提示找不到,应该是没有设置环境变量,搜了一下,sip可执行文件在~/miniforge3/envs/mypython3.8.20/bin目录下,只有sip-build sip-install 这些没有可执行文件sip
所以,python configure.py --sip ~/miniforge3/envs/mypython3.8.20/bin是不行的
然后我又下载了sip的源码,网上说用python configure.py编译,结果源码目录中就没有configure.py这个文件,原来在老的sip源码确实是有configure.py,新版本的改变了编译方式。
在源码目录下 pip install . 就行了。
sip执行成功后,在PyQt5源码目录下继续执行python configure.py还是没有sip命令。
后来搜了chatgpt,说需要用到sip-install,然后我在PyQt5的源码目录下执行命令
~/miniforge3/envs/mypython3.8.20/bin/sip-install 终于开始编译了。
编译过程报错
sip-install: Unable to import ‘project.py’: No module named ‘pyqtbuild’
直接安装pyqt-build
提示The dbus-python package does not seem to be installed.
然后用pip安装 pip install dbus-python
提示
dbus-gmain| Did not find pkg-config by name ‘pkg-config’
dbus-gmain| Found pkg-config: NO
dbus-gmain| Did not find CMake ‘cmake’
dbus-gmain| Found CMake: NO
dbus-gmain| Run-time dependency dbus-1 found: NO
安装:
apt install pkg-config cmake libdbus-1-dev
又提示
Run-time dependency glib-2.0 found: NO (tried pkgconfig and cmake)
继续安装:
apt install libglib2.0-dev
然后dbus-python安装成功
报错PyQt5-5.15.2/sip/QtCore/qprocess.sip: line 99: column 5: ‘Q_PID’ is undefined
这又是Qt版本不匹配的问题。
没办法,继续编译Qt源码
具体的在另一篇文章记录了https://blog.csdn.net/qq964939641/article/details/148139766?spm=1011.2415.3001.5331,这里不重复了,补充一点
编译时,提示opengl不支持,这里没用到,我直接跳过了-no-opengl
如果不跳过,
opengl 安装依赖:libegl1-mesa-dev
pulseaudio的错误安装依赖:sudo apt-get install pulseaudio*
gstreamer的错误安装依赖:sudo apt-get install libgstreamer* gstreamer*
xcb的错误安装依赖:sudo apt-get install libxkbcommon* libxcb* libthread*
编译过程中又出错了,但是没有提示,又用sip-install --verbose命令再次编译,给出了错误,应该是缺少opengl库,也不知道PyQt怎么跳过,所以又重新编译了Qt5源码,这次不跳过opengl了。
之后再次sip-install --verbose,终于成功,
执行PyQt程序报错
ModuleNotFoundError: No module named ‘PyQt5.sip’
直接安装 pyqt5-sip
然后运行过程中发现一个问题,耗时1天才解决,
qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “” even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, webgl, xcb.
一开始以为libxcb没安装,然后一顿装
sudo apt install build-essential libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev gdb cmake libxcb-xinerama0-dev libfontconfig1-dev libfreetype6-dev ‘^libxcb.*-dev’ libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
结果还是不行,然后发现编译成功的源码中没生成libqxcb.so这个库
root@tdhx-pc:/home/tdhx/mypython_install/qt-everywhere-src-5.15.10# ls /home/Qt5.15.10/plugins/platforms/
libqeglfs.so libqminimalegl.so libqoffscreen.so libqwebgl.so
libqlinuxfb.so libqminimal.so libqvnc.so
root@tdhx-pc:/home/tdhx/mypython_install/qt-everywhere-src-5.15.10# ls qtbase/plugins/platforms/
libqeglfs.so libqlinuxfb.so libqminimalegl.so libqminimal.so libqoffscreen.so libqvnc.so
然后各种搜索,又重新编译了一次,./configure过程中也没问题,关于XCB的检查都过了,make也没报错。
然后在run.sh脚本中又明确添加了xcb的支持 -qpa xcb -xcb
#! /bin/bash
./configure -prefix /home/Qt5.15.10 \
-opensource -confirm-license \
-nomake examples \
-nomake tests \
-release \
-xplatform linux-aarch64-gnu-g++ \
-qpa xcb \
-xcb \
-skip qt3d \
-skip qtcharts \
-skip qtandroidextras \
-skip qtlocation \
-skip qtmultimedia \
-skip qtsensors \
-skip qtserialbus \
-skip qtserialport \
-skip qtwayland\
-skip qtwebengine
编译完还是不行。
然后搜索说直接进到源码编译试试,看看会不会报问题。
root@tdhx-pc:/home/tdhx/mypython_install/qt-everywhere-src-5.15.10# cd qtbase/src/plugins/platforms/xcb/
qmake
make
报错Project ERROR: Could not find feature xcb-sm. make: *** [Makefile:46:sub-xcb_qpa_lib-pro-make_first-ordered] 错误 3
好像是缺少xcb-sm,但是我找了半天也找不到xcb-sm这个安装方式
有的说这个包含在libxcb源码中,我直接下载了源码,发现里边也没有这个名字。
然后搜到这个帖子https://blog.csdn.net/console_log/article/details/122881398里边提供了一个网址https://www.x.org/releases/individual/xcb/下载xcb的所有包。xcb-sm可能包含在这些包里,这些包有一些在apt软件源中找不到,我又下载源码编译安装。
然后我又在这个qt的官方网址https://doc.qt.io/qt-6/linux-requirements.html搜到了xcb依赖库,整个复制安装
apt install \
libfontconfig1-dev \
libfreetype-dev \
libgtk-3-dev \
libx11-dev \
libx11-xcb-dev \
libxcb-cursor-dev \
libxcb-glx0-dev \
libxcb-icccm4-dev \
libxcb-image0-dev \
libxcb-keysyms1-dev \
libxcb-randr0-dev \
libxcb-render-util0-dev \
libxcb-shape0-dev \
libxcb-shm0-dev \
libxcb-sync-dev \
libxcb-util-dev \
libxcb-xfixes0-dev \
libxcb-xkb-dev \
libxcb1-dev \
libxext-dev \
libxfixes-dev \
libxi-dev \
libxkbcommon-dev \
libxkbcommon-x11-dev \
libxrender-dev
然后在一个帖子上又找了一个
sudo apt install ‘^libxcb.*-dev’ libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
apt install libxkbcommon* libxcb* libthread*
都执行完以后,在源码目录qtbase/src/plugins/platforms/xcb/下make还是报错。
把以前编译的删掉,重新解压源码继续编译
./run.sh
make -j$(nproc)
make install
这下竟真的生成了libqxcb.so库。也不知道是哪一步起作用了。
运行程序,没问题了。
python程序打包
打包时,有一个报错
File "/home/tdhx/miniforge3/envs/python3.8/lib/python3.8/site-packages/PyInstaller/utils/hooks/qt/__init__.py", line 675, in _check_if_openssl_enabled
QSslSocket = QtNetwork.QSslSocket
AttributeError: module 'PyQt5.QtNetwork' has no attribute 'QSslSocket'
看样子是没有编译成功QSslSocket模块
进入python环境执行下边的命令
from PyQt5.QtNetwork import QSslSocket
print(“Supports SSL:”, QSslSocket.supportsSsl())
print(“SSL Libraries Build Version:”, QSslSocket.sslLibraryBuildVersionString())
print(“SSL Libraries Loaded Version:”, QSslSocket.sslLibraryVersionString())
发现都是找不到这个模块,应该是没有,不是导入的问题
我回到Qt5源码的编译目录,重新运行了configure 发现
Qt Network:
getifaddrs() ........................... yes
IPv6 ifname ............................ yes
libproxy ............................... no
Linux AF_NETLINK ....................... yes
OpenSSL ................................ yes
Qt directly linked to OpenSSL ........ yes
说明Qt源码./configure时成功找到了ssl
那么问题可能出在PyQt5的源码编译上。
我重新编译了PyQt5的源码,然后就成功了。
如果不行,而且确定不会使用QSslSocket模块,可以暂时屏蔽掉,
修改sudo vim /home/tdhx/miniforge3/envs/python3.8/lib/python3.8/site-packages/PyInstaller/utils/hooks/qt/init.py这个文件,修改成你的路径。
找到def _check_if_openssl_enabled(package):
修改为
def _check_if_openssl_enabled(package):
return False, 0x111000
False是必须的,第二个整数随便写。
再次打包,就会跳过ssl的检查。
打包成功后,运行程序有一个报错:
pysqlcipher3.dbapi2.DatabaseError: file is encrypted or is not a database
因为我的程序使用了自己编译的sqlcipher,用于sqlite数据库加密,应该是没有把libsqlcipher.so打包。所以在打包时指定动态库的路径用–add-binary ,类似下边这样
pyinstaller --onefile --noconsole --clean -F main.py -i ic_logo.png -n Cong_Client --add-binary=/home/tdhx/miniforge3/envs/python3.8/lib/libsqlcipher.so:. --add-binary=/home/tdhx/miniforge3/envs/python3.8/lib/libsqlcipher.so.0.8.6:. --add-binary=/home/tdhx/miniforge3/envs/python3.8/lib/libsqlcipher.so.0:. --paths=/home/tdhx/fileencryption: --exclude-module PyQt5.QtWebKit --exclude-module PyQt5.QtMultimedia --exclude-module PyQt5.QtTextToSpeech --exclude-module PyQt5.QtSensors --exclude-module PyQt5.QtQml --exclude-module PyQt5.QtSql --exclude-module PyQt5.QtQuickParticles --exclude-module PyQt5.QtQuick3D --exclude-module PyQt5.QtQuick --exclude-module PyQt5.QtNfc --exclude-module PyQt5.QtQuickShapes --exclude-module PyQt5.QtWebView --exclude-module PyQt5.QtQuickTemplates2 --exclude-module PyQt5.QtQuickControls2 --exclude-module PyQt5.QtQmlModels --exclude-module PyQt5.QtBluetooth --exclude-module PyQt5.QtWebSockets --exclude-module PyQt5.QtQmlWorkerScript --exclude-module PyQt5.QtRemoteObjects --exclude-module PyQt5.QtWebChannel --exclude-module PyQt5.QtXml --exclude-module PyQt5.QtXmlPatterns --exclude-module PyQt5.QtQuickTest --exclude-module PyQt5.QtTest --exclude-module PyQt5.QtPrintSupport --exclude-module PyQt5.QtSerialPort --exclude-module PyQt5.QtDBus --exclude-module PyQt5.QtOpenGL --exclude-module PyQt5.QAxContainer --exclude-module PyQt5.QtQuickWidgets --exclude-module PyQt5.QtDesigner --exclude-module PyQt5.QtHelp --exclude-module PyQt5.QtLocation --exclude-module PyQt5.QtMultimediaWidgets --exclude-module PyQt5.QtPositioning --exclude-module PyQt5.QtSvg --exclude-module PyQt5.QtWinExtras --exclude-module PyQt5.QtWebSockets
更多推荐


所有评论(0)