赞
踩
本次交叉编译是树莓派学习::qt5交叉编译(armv8 64位).的升级版,这次编译带opengl Es2的qt,原因是为了可以在树莓派上运行QtQuick2的程序。
结果:编译倒是编译出来了,但是
程序在目标板上跑不了,目测原因是该64位系统不支持opengl(或者说驱动没弄对)。可以利用xcb运行,只是比较慢,因为没有了物理的opengl驱动支持,只有mesa的opengl了,毕竟是非官方系统。以linuxfb运行程序时,程序打开,界面也有了,但只是残影,鼠标晃一下就没了,产生这个情况的原因是qt5.9对linuxfb做出了修改,qt5.9之后linuxfb只能在纯命令行下打开程序显示gui,否则会花屏。。还不如直接用xcb。虽然是半成品,但是这个过程对我的下一步(qt5.10.1交叉编译到树莓派官方系统)有很大帮助。
(1)硬件设备
(2)系统环境
一、树莓派环境配置
(1)由于还是用那个非官方的64位系统,就不再赘述系统的安装步骤了
(2)安装opengl
- sudo apt-get install libgles2-mesa
-
- sudo apt-get install libgles2-mesa-dev
(3)安装编译QT所需的环境【尽管我们不是在开发板上编译QT,但是我们需要这些库来构建sysroot】
- sudo apt-get install libxcb-xinerama0-dev
-
- sudo apt-add-repository ppa:u-szeged/sedkit
-
- sudo apt-get update
-
- sudo apt-get install sedkit-env-qtwebkit
-
- sudo apt-get install build-essential perl python git
-
- sudo apt-get install libx11-dev libxcb1-dev libxkbcommon-x11-dev libx11-xcb-dev libxext-dev
-
- sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby
-
- sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libfontconfig1-dev libcap-dev libxtst-dev libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libxss-dev libegl1-mesa-dev gperf bison
-
- sudo apt-get install libbz2-dev libgcrypt11-dev libdrm-dev libcups2-dev libatkmm-1.6-dev
-
- sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
(4)检查系统的编译器版本
二、笔记本(ubuntu16.04)环境配置
(1)交叉编译器下载
https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/
下载下图两个东西:
一个是编译器,一个是sysroot
(2)配置交叉编译器
不赘述,可参见 树莓派学习::qt5交叉编译(armv8 64位). 中的配置过程
(3)我们还下了另外一个东西,就是sysroot
简述一下这个东西的作用:用来构造文件系统,我们还需要把开发板上的opt、lib、usr等目录覆盖上去,二者合成一个文件系统,用来提供给交叉编译时编译器寻找头文件.h和库文件.so等东西用的。这样才能提供一个基本与目标开发板一致的环境,给出这个环境之后,编译时找头文件就不在笔记本(ubuntu16.04)的环境找了,只在sysroot这个目录里面找。
1)找个地方,创个目录
mkdir pi pi/sysroot
2)将下载下来的东西解压到sysroot目录下,效果如下:
3)取出树莓派sd卡,在sd卡的rootfs目录下,将lib、opt、usr/include、usr/lib目录的东西覆盖到这个/home/msi/pi/sysroot的对应目录。
选择合并、遇到相同的选择覆盖即可
【只要想着要构造出开发板的文件环境,你就知道怎么办了】
4)复制完成之后,回到pi目录下,新建一个sysroot.py文件,内容如下:
- #!/usr/bin/env python
- import sys
- import os
-
- # Take a sysroot directory and turn all the abolute symlinks and turn them into
- # relative ones such that the sysroot is usable within another system.
-
- if len(sys.argv) != 2:
- print("Usage is " + sys.argv[0] + "<directory>")
- sys.exit(1)
-
- topdir = sys.argv[1]
- topdir = os.path.abspath(topdir)
-
- def handlelink(filep, subdir):
- link = os.readlink(filep)
- if link[0] != "/":
- return
- if link.startswith(topdir):
- return
- #print("Replacing %s with %s for %s" % (link, topdir+link, filep))
- print("Replacing %s with %s for %s" % (link, os.path.relpath(topdir+link, subdir), filep))
- os.unlink(filep)
- os.symlink(os.path.relpath(topdir+link, subdir), filep)
-
- for subdir, dirs, files in os.walk(topdir):
- for f in files:
- filep = os.path.join(subdir, f)
- if os.path.islink(filep):
- #print("Considering %s" % filep)
- handlelink(filep, subdir)
5)保存后,给权限
sudo chmod +x sysroot.py
6)在pi目录下,执行如下,用来解决该目录下的符号链接问题
./sysroot.py sysroot
7)到这里,就基本环境配置完成
三、编译QT
(1)下载源码,这里我要编译的版本是qt5.10.1
http://download.qt.io/archive/qt/
选择对应的源码下载即可
(2)将源码解压,位置随意
(3)进入解压目录,新建一个autoconfig.sh文件,用来修改配置参数,内容如下
- #!/bin/sh
- ./configure -prefix /home/msi/arm/qt5101_64/qt_sdk \
- -verbose \
- -opensource \
- -release \
- -confirm-license \
- -xplatform linux-arm-gnueabi-g++ \
- -shared \
- -qt-zlib \
- -qt-libjpeg \
- -qt-libpng \
- -make libs \
- -linuxfb \
- -eglfs \
- -no-cups \
- -no-iconv \
- -no-pch \
- -no-opengl \
- -opengl es2 \
- -no-openssl \
- -nomake examples \
- -sysroot /home/msi/pi/sysroot
(4)从qt源码根目录中,进入
1)修改qmake.conf文件
2)修改后的内容如下
- #
- # qmake configuration for building with arm-linux-gnueabi-g++
- #
-
- MAKEFILE_GENERATOR = UNIX
- CONFIG += incremental
- QMAKE_INCREMENTAL_STYLE = sublib
-
-
- 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
-
-
- include(../common/linux.conf)
- include(../common/gcc-base-unix.conf)
- include(../common/g++-unix.conf)
-
- # modifications to g++.conf
- QMAKE_CC = aarch64-linux-gnu-gcc
- QMAKE_CXX = aarch64-linux-gnu-g++
- QMAKE_LINK = aarch64-linux-gnu-g++
- QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++
-
- # modifications to linux.conf
- QMAKE_AR = aarch64-linux-gnu-ar cqs
- QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
- QMAKE_NM = aarch64-linux-gnu-nm -P
- QMAKE_STRIP = aarch64-linux-gnu-strip
- load(qt_config)
(5)开始配置qt编译参数,即在qt源码根目录下,运行autoconfig.sh即可
- sudo chmod +x autoconfig.sh
-
- ./autoconfig.sh
配置结果有可能会提示opengl function test failed ,大概像这样
- #opengl es2头文件、库文件配置有错误:
-
- ERROR: Feature 'opengles2' was enabled, but the pre-conditio
-
- #EGL 头文件或库文件路径配置有错误:
-
- ERROR: Feature 'eglfs' was enabled, but the pre-conditio
-
这时候 ,可以在qt源码根目录下找到config.log,这个是configure配置时生成的日志,慢慢找是什么错误即可。
重新修改完后,还不能直接重新运行autoconfig.sh,需删除之前的配置文件config.cache和config.log,即删除下图的两个文件:
直到配置成功,大概会有如下输出:
(6)开始编译
make -j4
编译过程中,如果因出错而停止,而错误信息又看不到的时候,可再次运行一次make,这时候错误信息就很容易找到了
如果提示缺少什么头文件、库文件这些,查到对应问题后,
(1)可以将sd卡插回到板子上,用apt-get进行安装之后,
(2)重新配置sysroot,(即重新拷贝lib、usr/include、usr/lib等文件夹到sysroot对应目录),
(3)然后重新修正符号链接(即再次运行 ./sysroot.py sysroot)
(4)重新回到qt源码根目录,接着make -j4即可继续编译
编译完成输出:
(7)编译完成之后,运行make install
make install
(8)全部完成之后,可以看到生成的东西在sysroot目录下的prefix路径,即
四、开发板再配置
(1)将编译后的结果复制到开发板/home/pi目录下,我的目录是
编译结果的路径如下:/home/msi/pi/sysroot/home/msi/arm/qt5101_64
复制到树莓派下:/home/pi/qt5101_64
(2)开发板qt库路径配置
配置Qt的运行时环境,打开/etc/profile,在最后一行输入一下内容:
- export QTDIR=/home/pi/qt5101_64/qt_sdk #qtsdk在系统上的路径
- export QT_QPA_FONTDIR=$QTDIR/lib/fonts
- export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/
- export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
- export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0 #framebuffer驱动
- export QWS_MOUSE_PROTO=/dev/input/event0
如果配置了qml,要运行qtquick程序,还要加上下面的配置(否则会提示QTQUICK模块没有安装,具体可参见:
https://lemirep.wordpress.com/2013/06/01/deploying-qt-applications-on-linux-and-windows-3/):
- export QML_IMPORT_PATH=$QTDIR/qml
- export QML2_IMPORT_PATH=$QTDIR/qml
(3)刷新配置
source /etc/profile
(4)库文件配置
1)在/etc/ld.so.conf.d/目录下,新建一个qt5.conf
sudo gedit /etc/ld.so.conf.d/qt5.conf
2)加入qt_sdk的路径,即
/home/pi/qt5101_64/qt_sdk/lib/
3)刷新
sudo ldconfig
五、 测试
测试结果:
ldd 文件名
(1)关于提示#include_next<stdlib.h>no such file stdlib.h 的解决方案:
如果构建时,提示#include_next<stdlib.h>找不到 stdlib.h文件,那么,可尝试在.pro文件中加入一行:
QMAKE_CFLAGS_ISYSTEM=
相关可参见:https://github.com/voidlinux/void-packages/issues/5254
(2)运行测试
1)了解到qt5.9后关于linuxfb渲染插件的变化后,我重新尝试使用linuxfb运行
2)在xcb渲染插件下运行,速度较慢,但是可以完美显示qtquick2的程序,可能用了xcb调用了mesa的opengl
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。