Qt5源码编译是在Ubuntu虚拟机上完成的,因而需要在windows上安装VMware,建立Ubuntu虚 拟机,具体的安装步骤这里不做介绍,只给出Ubuntu下载网站。
Jetson TX1使用的编译器是aarch64-linux-gnu,Qt5交叉编译工具也选用linaro公司的aarch64-linux-gnu,下载地址稍后给出。
点击链接下载ubuntu-16.04-desktop-amd64.iso:
https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/16.04/
为了在编译时仿真TX1平台的环境,我们使用英伟达提供的L4T R24.2.1搭建/roots文件系统。
点击https://developer.nvidia.com/embedded/linux-tegra
下载
Tegra210_Linux_R24.2.1_aarch64.tbz2Tegra_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
~$sudo rsync -e ssh -avz [email protected]:/usr/include .
~$sudo rsync -e ssh -avz [email protected]:/usr/lib .
进入tx1/ Linux_for_Tegra/,运行sudo ./fixsymlink.sh ./roots/
~$tar xvfJ qt-everywhere-opensource-src-5.9.3.tar.xz -C
./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 |
指定目标平台文件系统路径 |
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
~$sudo tx1/qt/qt5-host/bin/qmake
~$make&&make install
同样是安装到了tx1/qt/qt5下~$sudo tx1/qt/qt5-host/bin/qmake
~$make&&make install
~$mkdir /usr/local/qt5
~$sudo chown ubuntu:ubuntu qt5
在虚拟机终端输入以下命令完成同步:~$ cd /tx1/qt/
~$ rsync -e ssh -avz qt5 [email protected]:/usr/local
点击 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下进行交叉编译,在线调试
点击Add,选择GCC->C++,名称和路径如上图所示,点击Apply.
Compilers配置完成。
若需调试,可配置Debuggers:
点击Add,选择GDB路径如上图:
/tx1/gcc/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu/bin/ aarch64-linux-gnu-gdb
Debuggers配置完成。
Qt Versions :
点击Add,选择qmake所在路径如上图,并修改名称:
tx1/qt/qt-host/bin/qmake
点击Apply.
QtVersions配置完成。
点击Add,名称和编译器配置如上图所示。
点击Apply。
Kits配置完成。
部署设备,配置Devices
~$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
#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文件。