Jetson Nano 源码编译安装PySide6

背景

最近要将一个使用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:

安装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看看版本是否正确

      扫描二维码关注公众号,回复: 14879586 查看本文章

    参考链接:ubuntu中编译安装gcc 9.2.0记录编译安装 GCC 11.2.0 _

安装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

猜你喜欢

转载自blog.csdn.net/OTZ_2333/article/details/129618756