Qt5.9.3源码的交叉编译---Jetson TX1

  • 转载请注明作者和出处:https://blog.csdn.net/xiaoqingyi_1014/article/details/80373168
  • 嵌入式系统:NVIDIA Jetson TX1
  • PC VMware虚拟机 Ubuntu 16.04
  • 交叉编译工具:aarch64-linux-gnu           
  • 配置文件下载地址:https://download.csdn.net/download/xiaoqingyi_1014/10440048              

                                                                                                                                                                                   

1. Qt5.9.3源码编译

 1.1 编译环境搭建

        Qt5源码编译是在Ubuntu虚拟机上完成的,因而需要在windows上安装VMware,建立Ubuntu虚   拟机,体的安装步骤这里不做介绍,只给出Ubuntu下载网站。
    Jetson TX1使用的编译器是aarch64-linux-gnu,Qt5交叉编译工具也选用linaro公司的aarch64-linux-gnu,下载地址稍后给出。

  • 建立Ubuntu虚拟机 

点击链接下载ubuntu-16.04-desktop-amd64.iso:

https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/16.04/

        之后在VMware上新建虚拟机Ubuntu-64-16.04。

  • 在虚拟机上安装TX1文件系统

为了在编译时仿真TX1平台的环境,我们使用英伟达提供的L4T R24.2.1搭建/roots文件系统。
点击https://developer.nvidia.com/embedded/linux-tegra
下载
Tegra210_Linux_R24.2.1_aarch64.tbz2 
Tegra_Linux_Sample-Root-Filesystem_R24.2.1_aarch64.tbz2
如图:
在虚拟机上创建tx1文件夹,将以上下载的两个文件放到tx1里并解压:
~$mkdir  tx1
~$cd  tx1
~$sudo  tar  xpf  Tegra210_Linux_R24.2.1_aarch64.tbz2
~$cd  Linux_for_Tegra/rootfs/
~$sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R24.2.1_aarch64.tbz2
~$cd ../
~$sudo ./apply_binaries.sh
  • TX1平台上安装qt依赖的库(需联网)---此处按需添加

    ~$sudoapt-get install '.*libxcb.*' libxrender-dev libxi-dev libfontconfig1-dev  libudev-dev
  • 若TX1 中无opengl库,则需手动安装。安装opengl es库,configure时才能添加选项-opengl es2
    在TX1平台上下载(需联网):

    ~$apt-get download libgles2-mesa-dev libegl1-mesa-dev
    ~$ar x …(省略号代表下载的两个文件,可分别解压到不同的文件夹)
    ~$tar xf data.tar.xz (两个均做同样的操作)
    ~$sudo cp -r EGL GLES2 GLES3 KHR /usr/include

       (拷贝四个文件夹到/usr/include)

       有一个符号链接需处理: sudo ln -s /usr/lib/aarch64-linux-gnu/tegra-egl/libGLESv2.so.2 libGLESv2.so

  • 同步文件到虚拟机
    安装结束后同步TX1平台上的文件到虚拟机:
    在虚拟机上进入tx1/ Linux_for_Tegra/rootfs/usr,同步命令:
     ~$sudo rsync -e ssh -avz [email protected]:/usr/include  .
     ~$sudo rsync -e ssh -avz [email protected]:/usr/lib  .
        注1:TX1 的IP为192.168.55.155,最后的‘ . ’不要丢了
        注2:  此处同步完后有部分符号链接异常需作如下操作:

                进入tx1/ Linux_for_Tegra/,运行sudo ./fixsymlink.sh ./roots/

  1.2 交叉编译工具下载

          点击 https://releases.linaro.org/components/toolchain/binaries/latest-6/aarch64-linux-gnu/
         下载gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu.tar.xz将其解压到虚拟机tx1/gcc下。

 1.3 Qt源码下载

         点击 http://download.qt.io/official_releases/qt/5.9/5.9.3/single/
         选择 tar.gz下载  qt-everywhere-opensource-src-5.9.3.tar.xz
         将其移到虚拟机后解压:  
  • ~$tar xvfJ qt-everywhere-opensource-src-5.9.3.tar.xz -C 

 1.4 源码编译

  •   configure
    autoconfig.sh文件内容如下
    ./configure \
    -v \
    -opensource \
    -confirm-license \
    -device-option CROSS_COMPILE=/home/XXX/tx1/gcc/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- \
    -device linux-jetson-tx1-g++ \
    -prefix /usr/local/qt5 \
    -extprefix /home/XXX/tx1/qt/qt5  \
    -hostprefix /home/XXX/tx1/qt/qt5-host  \
    -nomake examples \
    -nomake tests    \
    -nomake tools \
    -opengl es2 \
    -sysroot /home/XXX/tx1/Linux_for_Tegra/rootfs
    
    configure 目的是自动生成可用的makefile文件,因而需在此阶段指定目标平台配置文件,交叉编译工具、安装目录以及选择编译项等。

    Configure参数选项的介绍:

    参数

    功能

    -opensource -confirm-license

    使用opensource代码,并同意许可协议

    -device-option CROSS_COMPILE=

    指定编译器的路径和前缀

    -device linux-jetson-tx1-g++

    目标平台

    -prefix

    指定部署到目标平台的目录,也就是将来安装后qt库同步到TX1上的目录

    -extprefix

    存放交叉编译后的Qt库,会同步到tx1

    -hostprefix

    存放虚拟机上交叉编译app所需的工具

    -nomake examples

    不编译qt5自带的示例

    -nomake test

    不编译qt5 test文件

    -sysroot

    指定目标平台文件系统路径

    qt-everywhere-opensource-src-5.9.3/qtbase/mkspecs
    此目录下存放着Qt支持的目标平台的配置文件,而我们所需的TX1 配置文件在
    qt-everywhere-opensource-src-5.9.3/qtbase/mkspecs/devices/linux-jetson-tx1-g++ 内。但我们要支持opengl es2.0,则需要对此目录下的qmake.conf文件进行修改,主要是指定opengl库以及头文件的路径。修改之后的qmake.conf文件如下:
    include(../common/linux_device_pre.conf)
    
    QMAKE_INCDIR_POST += \
        $$[QT_SYSROOT]/usr/include \
        $$[QT_SYSROOT]/usr/include/aarch64-linux-gnu
    
    QMAKE_LIBDIR_POST += \
        $$[QT_SYSROOT]/usr/lib \
        $$[QT_SYSROOT]/lib/aarch64-linux-gnu \
        $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu
    
    QMAKE_RPATHLINKDIR_POST += \
        $$[QT_SYSROOT]/usr/lib \
        $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu \
        $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra \
        $$[QT_SYSROOT]/lib/aarch64-linux-gnu
        
    QMAKE_INCDIR_OPENGL[_ES2] += \
        $$[QT_SYSROOT]/include \
        $$[QT_SYSROOT]/include/EGL \
        $$[QT_SYSROOT]/include/GLES2 \
        $$[QT_SYSROOT]/include/GLES3 \
        $$[QT_SYSROOT]/include/KHR \
        $$[QT_SYSROOT]/usr/include \
        $$[QT_SYSROOT]/usr/include/EGL \
        $$[QT_SYSROOT]/usr/include/GLES2 \
        $$[QT_SYSROOT]/usr/include/GLES3 \
        $$[QT_SYSROOT]/usr/include/KHR
    
    QMAKE_LIBDIR_OPENGL[_ES2] += \
        $$[QT_SYSROOT]/lib/aarch64-linux-gnu/mesa-egl \
        $$[QT_SYSROOT]/lib/aarch64-linux-gnu/tegra-egl \
        $$[QT_SYSROOT]/lib/aarch64-linux-gnu   \
        $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/mesa-egl \
        $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra-egl \
        $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu
    
    QMAKE_LIBS_OPENGL[_ES2] += -lEGL -lGLESv2
    
    DISTRO_OPTS += aarch64
    COMPILER_FLAGS += -mtune=cortex-a57.cortex-a53 -march=armv8-a
    
    # When configured with -opengl es2, eglfs will be functional with its
    # dummy fullscreen X11 backend, in addition to xcb.
    EGLFS_DEVICE_INTEGRATION = eglfs_x11
    
    include(../common/linux_arm_device_post.conf)
    load(qt_config)

进入qt-everywhere-opensource-src-5.9.3/qtbase目录,运行:

sudo ./autoconfig.sh

较重要的打印如下:

OpenGL:
    EGL .................................. yes
    Desktop OpenGL ....................... no
    OpenGL ES 2.0 ........................ yes
    OpenGL ES 3.0 ........................ yes
    OpenGL ES 3.1 ........................ yes
... ... ...
QPA backends:
  DirectFB ............................... no
  EGLFS .................................. yes
  EGLFS details:
    EGLFS i.Mx6 .......................... no
    EGLFS i.Mx6 Wayland .................. no
    EGLFS EGLDevice ...................... yes
    EGLFS GBM ............................ no
    EGLFS Mali ........................... no
    EGLFS Rasberry Pi .................... no
    EGL on X11 ........................... yes
  LinuxFB ................................ yes
... ... ...
t is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /usr/local/qt5


Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

注1: autoconfig.sh是我自己创建的一个脚本,在qtbase目录下

注2: 在qtbase 目录下执行 ./configure -h查看configure支持的选项

注3: 此处我们先编译qt5的基础模块qtbase,与其同级的模块到时按需编译,如quick等

注4: linux-jetson-tx1-g++ 目录内的平台相关的配置文件是生成makefile文件的重要组成部分,指定了与平台相关的头文件以及库的路径,平台架构,还有渲染插件类型。其中

EGLFS_DEVICE_INTEGRATION 指定了opengl 渲染的插件类型是eglfs,且基于x11的;若是基于DRM,则需选择eglfs_kms_egldevice
  • make&& make install   qtbase
    Qt5模块分为三大类:qt基本模块、qt扩展模块、qt开发工具。
    此次只编译qt基本模块也就是qtbase,扩展模块和开发工具选择编译。
    进入qt-everywhere-opensource-src-5.9.3/qtbase
    ~$make
    成功后:
    ~$make install
    可将qt5安装到了tx1/qt/qt5下;虚拟机交叉编译应用程序的工具存放在tx1/qt/qt-host,里面包括有qmake以及版本信息等文件。
  • make && make install  qtdeclarative,包含有quick以及qml等模块
    ~$sudo tx1/qt/qt5-host/bin/qmake
    ~$make&&make install
    同样是安装到了tx1/qt/qt5下
  • 编译特效模块qtgraphicaleffects
    ~$sudo tx1/qt/qt5-host/bin/qmake
    ~$make&&make install
  • 同步qt5库到TX1平台/usr/local/qt5
    TX1目录/usr/local/qt5由configure选项-prefix指定。
    在TX1平台创建目录:
    ~$mkdir /usr/local/qt5
    ~$sudo chown ubuntu:ubuntu qt5
    在虚拟机终端输入以下命令完成同步:
    ~$ cd /tx1/qt/
    ~$ rsync -e ssh -avz qt5 [email protected]:/usr/local

2. Qt5 开发环境搭建

2.1 windows和 虚拟机上 Qt5开发环境Qt Creator安装

点击 http://download.qt.io/official_releases/qt/5.9/5.9.3/ 下载  
windows:  qt-opensource-windows-x86-5.9.3.exe
linux       :  qt-opensource-linux-x64-5.9.3.run
运行安装包安装Qt5  Creator。
安装过程需注册qt账号!
Windows下进行日常的qt调试设计;

Ubuntu-64下进行交叉编译,在线调试

2.2 Ubuntu虚拟机上部署调试环境

接下来配置Qt creator(安装qt5时自动安装的可视化编译调试界面):
在虚拟机上打开Qt creator,点击最上方的工具(tools)->选项(option):
  • 配置Build&Run下的三个选项:Compilers;Qt Versions;Kits
    Compilers:
    Qt5.9.3源码的交叉编译---Jetson TX1_第1张图片
    点击Add,选择GCC->C,名称和路径如上图所示,点击Apply

    Qt5.9.3源码的交叉编译---Jetson TX1_第2张图片

    点击Add,选择GCC->C++,名称和路径如上图所示,点击Apply.
    Compilers配置完成。

    若需调试,可配置Debuggers:
    Qt5.9.3源码的交叉编译---Jetson TX1_第3张图片
    点击Add,选择GDB路径如上图:
    /tx1/gcc/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu/bin/ aarch64-linux-gnu-gdb
    Debuggers配置完成。

    Qt Versions :

    Qt5.9.3源码的交叉编译---Jetson TX1_第4张图片

    点击Add,选择qmake所在路径如上图,并修改名称:
    tx1/qt/qt-host/bin/qmake
    点击Apply.
    QtVersions配置完成。

    Kits:
    Qt5.9.3源码的交叉编译---Jetson TX1_第5张图片

    点击Add,名称和编译器配置如上图所示。
    点击Apply。
    Kits配置完成。

  • 部署设备,配置Devices

    左侧选择Devices,点击Add,选择Generic Linux Device:
    Qt5.9.3源码的交叉编译---Jetson TX1_第6张图片

    配置如上图所示,Next,finish.
    之后会自动检测并连接设备:
    Qt5.9.3源码的交叉编译---Jetson TX1_第7张图片

2.3 示例演示

     前面两节已经将所有的开发环境搭建完成,这节主要讲述使用Qt5开发的例子,检测开发环境是否可用。
以qt5的一个示例电影体验演示qt5-cinematic-experience作为讲解。
在虚拟机上下载qt5的示例代码:
创建qt_project文件夹,作为所有qt项目的存储路径
~$cd qt_project
~$mkdir cinematic 
~$ git clone https://github.com/alpqr/qt5-cinematic-experience.git

前提是虚拟机必须安装git;下载后修改qt5-cinematic-experience的归属:
sudo chown suma:suma qt5-cinematic-experience -R

  • QtCreator 添加示例文件
    打开Qt Creator,选择
    Welcome->open project->qt_project/cinematic/qt5-cinematic-experience/
    qt5-cinematic-experience.pro

    打开后选择TX1编译组件,点击Configure Project
    Qt5.9.3源码的交叉编译---Jetson TX1_第8张图片
    之后进入qt5-cinematic-experience.pro文件,添加:
    target.path = /home/ubuntu/qt/$$TARGET
    INSTALLS += target
    Qt5.9.3源码的交叉编译---Jetson TX1_第9张图片

    之后点击左侧Projects,点击Run,部署配置如图所示:
    Qt5.9.3源码的交叉编译---Jetson TX1_第10张图片
    示例启动程序将会部署到TX1平台下的qt/qt5-cinematic-experience路径下。
  • TX1平台
    部署成功后需在TX1平台export指定qt库路径;
    将/dev/input/event*设置为可读的,这样运行后才能够识别到应用程序中鼠标的移动、按键、键盘输入等操作。
    具体配置如下:
   #qt5 
   sudo chmod a+rwx /dev/input/event*
   export PATH=/usr/local/qt5/bin:$PATH
   export LD_LIBRARY_PATH=/usr/local/qt5/lib:$LD_LIBRARY_PATH
   export QT_QPA_EGLFS_ALWAYS_SET_MODE=1
   export QT_QPA_EGLFS_HIDECURSOR=1
   export QT_QPA_FB_HIDECURSOR=1
   export QT_LOGGING_RULES=qt.qpa.input=true
   export QT_QPA_EGLFS_DEBUG=1

       若要重启生效,则将上面配置到TX1平台下/home/Ubuntu/.bashrc文件。

  • 运行
    配置结束后,可以在虚拟机上的Qt Creator 点击RUN,此示例便会在TX1平台连接的显示器上显示:
    Qt5.9.3源码的交叉编译---Jetson TX1_第11张图片
    Qt5.9.3源码的交叉编译---Jetson TX1_第12张图片

你可能感兴趣的:(Qt5)