背景
最近要将一个使用PySide6写GUI的程序部署到英伟达Jetson Nano上。原本以为装个conda就能很快装好环境,结果发现arm的生态有点太糟糕了,啥都要自己编译安装,尤其是这个Pyside6。经过几天的探索,终于成功安装,于是写篇教程弥补一下网上对相关内容的缺失。
Pyside6不仅源码要自己编译,相关的各种依赖也各种麻烦。下文将我用源码编译安装PySide6的完整历程都写下来了。首先要安装python
主要参考连接:https://gitlab.com/-/snippets/2432339
安装
强烈推荐看完一遍后再上手操作
安装之前一定要保证Jetson Nano的时间正确,否则后续编译可能会报错(我的Jetson Nano就是每次重启了时间都不对,怎么调都不行,必须要每次手动调整时间)
安装python
- 我选择的是安装miniconda3(因为anaconda3太大了,而且自带的很多库用不着)
- 下载aarch64架构的安装包。要选择旧版的,否则可能用pip的时候可能会报错
Illegal instruction (core dumped)
。我选择是从清华镜像上下载的,选择的是Miniconda3-py37_4.9.2-Linux-aarch64.sh。我选py37是因为我还想装3.4.2.16的opencv,应该也可以选py39 - 安装到个人目录下面。如果安装到opt然后个人用户创建环境,可能会报错“Illegal instruction (core dumped)”
- 安装完成后记得到~/.bashrc或者其他地方添加环境变量,类似如下,以保证后面用的python是miniconda的
可以用命令export PATH=/home/xxx/miniconda3:$PATH
which python
查看用的是哪儿的python
安装cmake:
- 后续编译Qt需要
- 安装3.12及以上的cmake,否则后面编译Qt的时候会报错cmake的相关错误(具体我忘了保存,大概是说CMakeLists.txt中的某个命令不支持)
- 但是不能安装太新(比如3.26及以上),不然后面编译Qt可能会报错“Cannot set “__qt_configure_reports”: current scope has no parent.”
- 最后我安装的是3.24.4版本的cmake
安装GCC
- 后续编译Qt需要
- 要求版本>8.1,否则可能会报错’charconv’ file not found。
- 由于apt里面没有8及以上的gcc,我选择从源码编译安装,选择的版本是gcc-8.5.0。编译安装的简单教程如下:
-
下载源码并解压
-
进入源码目录,并运行如下命令进行自动配置
./contrib/download_prerequisites
看到以下类似结果表示成功
gmp-6.1.0.tar.bz2: 成功
mpfr-3.1.4.tar.bz2: 成功
mpc-1.0.3.tar.gz: 成功
isl-0.18.tar.bz2: 成功
All prerequisites downloaded successfully.- 如果一直下载不下来,可以编辑
./contrib/download_prerequisites
这个文件,将base_url中的ftp改成https,将${fetch} --no-verbose -O
改成${fetch} -c -O
- 如果一直下载不下来,可以编辑
-
设置编译选项,生成make文件
mkdir build && cd build ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
-
编译安装(耗时很久)
make -j4 #我试了使用全部线程好像并不会卡死 sudo make install
-
检查:运行命令
gcc -v
看看版本是否正确
-
安装Clang
- 后续编译Qt需要
- apt源里面没有clang,所以又需要自己源码编译安装,过程参考官方教程,我选的版本是llvmorg-15.0.7。这里是所需依赖。
- 编译的时候需要开启LLVM_ENABLE_RTTI 和 LLVM_ENABLE_EH,否则后面编译开启了xcb的Qt会报错`undefined reference to `typeinfo for clang::ASTFrontendAction`
- 简单教程如下
git clone -b llvmorg-15.0.7 --depth=1 https://github.com/llvm/llvm-project.git cd llvm-project cmake -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" ../llvm ccmake .. # 开启将LLVM_ENABLE_RTTI 和 LLVM_ENABLE_EH设置为ON,然后先按c再按g。或者可以直接将这两个参数加到上面的cmake命令,但是我没试过 make -j4 sudo make install
安装Qt
-
安装依赖:在“主要参考链接”中给了这么多依赖项
sudo apt install -y build-essential cmake curl git libfontconfig-dev libfreetype-dev libglib2.0-dev libgl-dev \ libgl1-mesa-dev libice-dev libsm-dev libssl-dev libx11-dev libx11-xcb-dev libxcb1-dev libxcb-glx0-dev \ libxcb-icccm4-dev libxcb-image0-dev libxcb-xinput-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render-util0-dev \ libxcb-render0-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-util-dev libxcb-xfixes0-dev \ libxcb-xinerama0-dev libxcb-xinput-dev libxcb-xkb-dev libxext-dev libxfixes-dev libxi-dev libxkbcommon-dev \ libxkbcommon-x11-dev libxrender-dev ninja-build # 我删去了clang libclang-dev
不过很多依赖在apt中都找不到(猜测是arm和aarch64有区别?),于是我从pkgs.org这个网站上手动搜索每个依赖程序,下载arm64版本的deb包,然后手动安装(用apt或者dpkg),下面是我找到的一些下载链接,仅供参考
https://api.pkgs.org/autocomplete/libxkbcommon-x11-dev_0.8.2-1~ubuntu18.04.1_arm64.deb
http://ports.ubuntu.com/pool/main/libx/libxkbcommon/libxkbcommon-x11-dev_0.8.2-1~ubuntu18.04.1_arm64.deb
http://ports.ubuntu.com/pool/main/libx/libxcb/libxcb-xkb-dev_1.13-2~ubuntu18.04_arm64.deb
http://ports.ubuntu.com/pool/main/libx/libxcb/libxcb-xinerama0-dev_1.13-2~ubuntu18.04_arm64.deb
http://ports.ubuntu.com/pool/main/x/xcb-util/libxcb-util-dev_0.4.0-0ubuntu3_arm64.deb
http://ports.ubuntu.com/pool/main/x/xcb-util-renderutil/libxcb-render-util0-dev_0.3.9-1_arm64.deb
https://ubuntu.pkgs.org/18.04/ubuntu-main-arm64/libxcb-icccm4-dev_0.4.1-1ubuntu1_arm64.deb.html
http://ports.ubuntu.com/pool/universe/n/ninja-build/ninja-build_1.8.2-1_arm64.deb
http://ports.ubuntu.com/pool/main/x/xcb-util-image/libxcb-image0-dev_0.4.0-1build1_arm64.deb
http://ports.ubuntu.com/pool/main/x/xcb-util-keysyms/libxcb-keysyms1-dev_0.4.0-1_arm64.deb
http://ports.ubuntu.com/pool/main/x/xcb-util-wm/libxcb-icccm4-dev_0.4.1-1ubuntu1_arm64.deb
https://api.pkgs.org/autocomplete/libxkbcommon-x11-dev_0.8.0-1_arm64.deb -
下载qt-everywhere安装包并解压。“主要参考链接”中安装的是6.4.0版本,但是我发现会报错
non-virtual member function marked 'override' hides virtual member function
(见这个和这个),所以我最终选的是6.4.3版本 -
自动配置:
- 编译完整的qt非常耗时(总共有1w+的文件),为了节约时间,有一些qt的sub module我没有编译。不过我没找到PySide6具体依赖哪些sub module,经过我的试错,qtbase、qtdeclarative、qttools和qtwebsockets必须开启(不然后面编译PySide6会报错)
- 除了不编译(skip)一些submodule,自动配置的时候必须开启xcb,否则后面运行PySide写的GUI可能会报错
qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "xxx"
- 我最终的编译命令如下
cd qt-everywhere-src-6.4.3 && mkdir build && cd build ../configure -feature-xcb -skip qt3d -skip qtquick3d -skip qtquick3dphysics -skip qtvirtualkeyboard -skip qtsensors
-
编译安装(耗时很久)
cmake --build . --parallel 4 sudo cmake --install .
安装PySide6
-
编译源码:qtpaths改成自己前面安装的qt的路径
git clone https://code.qt.io/pyside/pyside-setup cd pyside-setup git checkout 6.4 python -m pip install -r requirements.txt python setup.py build \ --qtpaths=/usr/local/Qt-6.4.3/bin/qtpaths \ --ignore-git \ --parallel 4 \ --standalone
-
生成whl文件并安装:
python create_wheels.py cd dist_new pip install ./*whl
-
最后就可以测试自己用PySide6写的GUI程序。贴一张我的成功运行的图片,我的程序其实是基于PyOneDark_Qt_Widgets_Modern_GUI(对PySide6进行二次封装)
PS: 如果在运行自己程序的时候还是报错,可以先添加环境变量QT_DEBUG_PLUGINS=1
,然后再次运行自己的程序,这个时候会有更加详细的报错信息。如果保存信息是类似qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "/home/xxx/miniconda3/bin/platforms"
,但是/home/xxx/miniconda3/bin/platforms
这个路径是不存在的,实际上应该找的是/home/xxx/miniconda3/lib/python3.7/site-packages/PySide6/Qt/plugins/platforms
,也不知道为啥找到前面那个路径。我的解决方法是用软链接,即ln -s /home/xxx/miniconda3/lib/python3.7/site-packages/PySide6/Qt/plugins/platforms /home/xxx/miniconda3/bin/platforms
编译文件
我把下载的安装包、编译好的文件等相关的文件都上传到了百度网盘,有需要的自取
链接: https://pan.baidu.com/s/1eiuELtUdB7z7i3YiP2MKMg?pwd=kdqh 提取码: kdqh