樹莓派學習::qt5.10.1交叉編譯【帶opengl ES2】到官方Raspbian Stretch

qt5.10.1交叉編譯【帶opengl ES2】到官方Raspbian Stretch


本次更新是樹莓派學習::qt5.10.1交叉編譯【帶opengl ES2】(armv8 64位)的延續,這次編譯帶的目標平臺是樹莓派3b+的官方系統Raspbian Stretch。由於是官方系統,這次交叉編譯會輕鬆很多。不過還是要構建sysroot文件系統。

結果:

  • linuxfb:成功
  • xcb:成功
  • eglfs:成功

測試環境(與前兩篇的不一樣)

(1)硬件設備

  •  msi筆記本,I7-4710H,16G內存
  • 樹莓派3b+,armv8(64位),16Gsd卡

(2)系統環境

  • 筆記本:ubuntu16.04 x64位
  • 樹莓派3b+:Raspbian Stretch 2018-11-13 【32位】

 

一、樹莓派環境配置

(1)由於使用官方的系統,這個比較簡單,不贅述。自行百度相關教程

(2)安裝opengl   ?-------------------->不需要

官方系統已經有opengl相關文件了,在/opt/vc目錄下。

否則按百度上的教程下載的只是mesa的opengl(基於軟件實現的),這種的話就不是用樹莓派自帶的物理GPU,所以不推薦。

(3)雖然不需要安裝opengl庫,但是其他庫還是要的,因爲要用樹莓派的文件系統構築sysroot

  • 下面的看需要安裝,其中有libx*,libx11的強烈建議安裝(即上半部分)
sudo apt-get update

sudo apt-get install libxcb-xinerama0-dev

sudo apt-add-repository ppa:u-szeged/sedkit

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 libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0



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

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)檢查系統的編譯器版本

 

二、筆記本(ubuntu 16.04 64bit)環境配置

(1)下載交叉編譯器

由於樹莓派官方系統是32位的,因此要下載32位的交叉編譯器,這裏推薦:

https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/

(2)配置交叉編譯器

mkdir pi_32
cd pi_32

將編譯器解壓到/home/xxx/pi_32/目錄下,即如下圖所示:

 

然後就不需要像前兩篇文章一樣進行路徑設定了,因爲等下配置qt時直接把絕對路徑寫入即可。

(3)開始構築sysroot

爲什麼需要構築sysroot?

因爲編譯QT時,需要目標平臺下的庫文件參與,這也是爲了編譯出來的QT庫複製到開發板上之後可以找到對應的庫文件。配置qt的編譯選項時,將這個sysroot給定,那麼編譯qt時所需要一些頭文件 、庫文件就到這個sysroot目錄下去找,而不再去筆記本的ubuntu16.04目錄下找

1)在pi_32目錄下新建文件夾sysroot、sysroot/lib、sysroot/usr、sysroot/opt

2)將樹莓派的sd卡插入電腦,將rootfs目錄下對應的文件夾拷貝到pi_32/sysroot目錄下,如下圖:

  • /rootfs/lib 直接複製到 /pi_32/sysroot/
  • /rootfs/opt/vc 複製到 /pi_32/sysroot/opt
  • /rootfs/usr/include和/rootfs/usr/lib 複製到/pi_32/sysroot/usr

3)修正openglES2、EGL、等庫文件的鏈接(這一步可參見指導文檔:http://www.tal.org/tutorials/building-qt-512-raspberry-pi或者https://wiki.qt.io/RaspberryPi2EGLFS,建議先看前者)【這一步很重要,否則可能在配置qt編譯選項或者編譯qt時會出問題】

(a)先移除mesa的opengl庫文件,如果沒有裝就沒有,這一步是以防編譯qt時用了mesa的opengl而沒有用樹莓派自帶的物理GPU,在pi_32/sysroot目錄下執行如下:(不加sudo的原因是這並非操作筆記本ubuntu的系統文件,僅僅是sysroot文件夾 裏面的文件,也是爲了避免多了一'/'而導致不必要的錯誤)

mv usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup

mv usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup

(b)由於樹莓派官方爲了區分mesa的opengl和自帶的物理opengl,官方將opengl的相關庫文件都改名了,然而QT在編譯時尋找的時候是尋找普遍的opengl庫名字,因此,需要創建鏈接,讓QT編譯時可以正確找到樹莓派的物理OPENGL庫文件:

ln -s opt/vc/lib/libEGL.so usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0

ln -s opt/vc/lib/libGLESv2.so usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

ln -s opt/vc/lib/libbrcmEGL.so opt/vc/lib/libEGL.so

ln -s opt/vc/lib/libbrcmGLESv2.so.2 opt/vc/lib/libGLESv2.so

ln -s opt/vc/lib/libEGL.so opt/vc/lib/libEGL.so.1

ln -s opt/vc/lib/libGLESv2.so opt/vc/lib/libGLESv2.so.2

4)複製完成之後,回到pi_32目錄下,創建sysroot.py,內容如下:

  • 這個文件是用來修復sysroot的符號鏈接問題,以便編譯QT時找到對應的庫文件
#!/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)修復庫鏈接問題,在pi_32目錄下運行如下:

sudo chmod +x sysroot.py
./sysroot.py sysroot

 運行之後一般會有一些輸出,就ok了

 6)到這裏,環境配置基本完成

 

三、編譯QT

(1)下載源碼,這裏我要編譯的版本是qt5.10.1

http://download.qt.io/archive/qt/

選擇對應的源碼下載即可

(2)將源碼解壓,位置隨意

(3)進入解壓目錄,新建一個autoconfig.sh文件,用來修改配置參數,內容如下

  • 其中,路徑問題根據自身實際修改
  • -extprefix 爲輸出qt庫目錄,這個目錄遲點要複製到樹莓派上
  • -hostprefix 爲本地主機qt creator配置kit套件所需的目錄,不用複製到樹莓派上
  • -device 這裏爲選擇的目標設備,目標設備的配置文件可在/qtbase/mkspec/device找到
  • -device-option CROSS_COMPILE= 這裏給定我們剛剛下載的交叉編譯器的路徑,注意最後那裏的arm-linux-gnueabihf- ,確實有一槓,不要以爲打錯了
  • -sysroot爲我們剛剛構建開發板文件系統的路徑
  • -linuxfb表示編譯這個插件,這個是軟件渲染的插件,用於顯示qtgui程序
  • -eglfs 爲硬件渲染插件,用這個運行程序,將會強制程序全屏化
  • -openg es2表示編譯帶opengl es2的qt
#!/bin/sh  
./configure \
-v \
-prefix /home/msi/arm/qt5101_32/qt_sdk \
-extprefix /home/msi/arm/qt5101_32/extprefix \
-hostprefix /home/msi/arm/qt5101_32/hostprefix \
-opensource \
-release \
-confirm-license \
-device linux-rasp-pi3-vc4-g++ \
-device-option CROSS_COMPILE=/home/msi/pi_32/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- \
-sysroot /home/msi/pi_32/sysroot \
-make libs \
-qt-zlib \
-qt-libjpeg \
-qt-libpng \
-no-pch \
-no-iconv \
-no-cups \
-no-openssl \
-nomake tools \
-nomake examples \
-no-use-gold-linker \
-opengl es2 \
-linuxfb \
-eglfs

(4)從qt源碼根目錄中,進入

1)修改qmake.conf文件,需要修改opengl es2、EGL、openvg庫文件的路徑,修改完的內容如下:

# qmake configuration for the Raspberry Pi 3 (32-bit) using the
# *experimental* VC4 driver for Mesa and DRM.
#
# This should allow accelerated EGL and OpenGL with eglfs via
# KMS/DRM/GBM (instead of the Broadcom-specific backend), under X11
# with xcb, and also enables (Qt)Wayland via the standard wayland-egl
# path. See https://dri.freedesktop.org/wiki/VC4
#
# Note that this is not the same as the default, Broadcom proprietary
# driver. Some functionality and extensions may therefore be missing,
# in particular when it comes to accelerated multimedia (video,
# camera).
#
# At the time of writing Raspbian has to be switched explicitly to the
# experimental VC4 driver. To do this, run raspi-config and enable it
# in Advanced Options -> GL Driver.
#
# Example configure command below. We disable using the GNU gold
# linker as it apparently has issues with ARMv8. In the configure
# output check that "EGLFS GBM .......... yes" is present, otherwise
# eglfs will not be functional.
#
# ./configure -release -opengl es2 -device linux-rpi3-vc4-g++ \
#   -device-option CROSS_COMPILE=~/raspbian/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- \
#   -sysroot ~/raspbian/sysroot \
#   -prefix /usr/local/qt5pi -extprefix ~/raspbian/qt5pi -hostprefix ~/raspbian/qt5 \
#   -v -nomake examples -nomake tests -no-use-gold-linker

include(../common/linux_device_pre.conf)

QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/opt/vc/lib
 
QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/lib
QMAKE_LIBDIR_EGL        = $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG     = $$QMAKE_LIBDIR_OPENGL_ES2
 
QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/opt/vc/include \
                          $$[QT_SYSROOT]/opt/vc/include/interface/vcos/pthreads \
                          $$[QT_SYSROOT]/opt/vc/include/interface/vmcs_host/linux
 
QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}
 
QMAKE_LIBS_EGL          = -lEGL -lGLESv2
QMAKE_LIBS_OPENVG       = -lEGL -lOpenVG -lGLESv2

QMAKE_CFLAGS            = -march=armv8-a -mtune=cortex-a53 -mfpu=crypto-neon-fp-armv8
QMAKE_CXXFLAGS          = $$QMAKE_CFLAGS

DISTRO_OPTS            += hard-float
DISTRO_OPTS            += deb-multi-arch

EGLFS_DEVICE_INTEGRATION = eglfs_kms

include(../common/linux_arm_device_post.conf)

load(qt_config)

2)linux-rasp-pi3-vc4-g++ 和linux-rasp-pi3-g++ 的區別,貌似是vc4的是開啓硬件加速video core 4,實際估計差不多。

(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,即刪除下圖的兩個文件:

直到配置成功,大概會有如下輸出:

Build options:
  Mode ................................... release
  Optimize release build for size ........ no
  Building shared libraries .............. yes
  Using C++ standard ..................... C++1z
  Using ccache ........................... no
  Using gold linker ...................... no
  Using new DTAGS ........................ yes
  Using precompiled headers .............. no
  Using LTCG ............................. no
  Target compiler supports:
    NEON ................................. yes
  Build parts ............................ libs
Qt modules and options:
  Qt Concurrent .......................... yes
  Qt D-Bus ............................... yes
  Qt D-Bus directly linked to libdbus .... no
  Qt Gui ................................. yes
  Qt Network ............................. yes
  Qt Sql ................................. yes
  Qt Testlib ............................. yes
  Qt Widgets ............................. yes
  Qt Xml ................................. yes
Support enabled for:
  Using pkg-config ....................... yes
  QML debugging .......................... yes
  udev ................................... yes
  Using system zlib ...................... no
Qt Core:
  DoubleConversion ....................... yes
    Using system DoubleConversion ........ no
  GLib ................................... no
  iconv .................................. no
  ICU .................................... no
  Logging backends:
    journald ............................. no
    syslog ............................... no
    slog2 ................................ no
  Using system PCRE2 ..................... no
Qt Network:
  getifaddrs() ........................... yes
  IPv6 ifname ............................ yes
  libproxy ............................... no
  OpenSSL ................................ no
    Qt directly linked to OpenSSL ........ no
  SCTP ................................... no
  Use system proxies ..................... yes
Qt Gui:
  Accessibility .......................... yes
  FreeType ............................... yes
    Using system FreeType ................ yes
  HarfBuzz ............................... yes
    Using system HarfBuzz ................ no
  Fontconfig ............................. no
  Image formats:
    GIF .................................. yes
    ICO .................................. yes
    JPEG ................................. yes
      Using system libjpeg ............... no
    PNG .................................. yes
      Using system libpng ................ no
  EGL .................................... yes
  OpenVG ................................. yes
  OpenGL:
    Desktop OpenGL ....................... no
    OpenGL ES 2.0 ........................ yes
    OpenGL ES 3.0 ........................ no
    OpenGL ES 3.1 ........................ no
    OpenGL ES 3.2 ........................ no
  Vulkan ................................. no
  Session Management ..................... yes
Features used by QPA backends:
  evdev .................................. yes
  libinput ............................... yes
  INTEGRITY HID .......................... no
  mtdev .................................. no
  tslib .................................. yes
  xkbcommon-evdev ........................ yes
QPA backends:
  DirectFB ............................... no
  EGLFS .................................. yes
  EGLFS details:
    EGLFS OpenWFD ........................ no
    EGLFS i.Mx6 .......................... no
    EGLFS i.Mx6 Wayland .................. no
    EGLFS RCAR ........................... no
    EGLFS EGLDevice ...................... no
    EGLFS GBM ............................ no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... yes
    EGL on X11 ........................... no
  LinuxFB ................................ yes
  VNC .................................... yes
  Mir client ............................. no
  X11:
    Using system-provided XCB libraries .. no
    EGL on X11 ........................... no
    Xinput2 .............................. no
    XCB XKB .............................. yes
    XLib ................................. yes
    XCB render ........................... yes
    XCB GLX .............................. no
    XCB Xlib ............................. yes
    Using system-provided xkbcommon ...... no
    Native painting (experimental) ....... no
Qt Widgets:
  GTK+ ................................... no
  Styles ................................. Fusion Windows
Qt PrintSupport:
  CUPS ................................... no
Qt Sql:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  MySql .................................. no
  OCI (Oracle) ........................... no
  ODBC ................................... no
  PostgreSQL ............................. no
  SQLite2 ................................ no
  SQLite ................................. yes
    Using system provided SQLite ......... no
  TDS (Sybase) ........................... no
Qt SerialBus:
  Socket CAN ............................. yes
  Socket CAN FD .......................... yes
QtXmlPatterns:
  XML schema support ..................... yes
Qt QML:
  QML interpreter ........................ yes
  QML network support .................... yes
Qt Quick:
  Direct3D 12 ............................ no
  AnimatedImage item ..................... yes
  Canvas item ............................ yes
  Support for Qt Quick Designer .......... yes
  Flipable item .......................... yes
  GridView item .......................... yes
  ListView item .......................... yes
  Path support ........................... yes
  PathView item .......................... yes
  Positioner items ....................... yes
  ShaderEffect item ...................... yes
  Sprite item ............................ yes
Qt Gamepad:
  SDL2 ................................... no
Qt 3D:
  Assimp ................................. yes
  System Assimp .......................... no
  Output Qt3D Job traces ................. no
  Output Qt3D GL traces .................. no
  Use SSE2 instructions .................. no
  Use AVX2 instructions .................. no
  Aspects:
    Render aspect ........................ yes
    Input aspect ......................... yes
    Logic aspect ......................... yes
    Animation aspect ..................... yes
    Extras aspect ........................ yes
Qt 3D GeometryLoaders:
  Autodesk FBX ........................... no
Qt Wayland Client ........................ no
Qt Wayland Compositor .................... no
Qt Bluetooth:
  BlueZ .................................. no
  BlueZ Low Energy ....................... no
  Linux Crypto API ....................... no
  WinRT Bluetooth API (desktop & UWP) .... no
Qt Sensors:
  sensorfw ............................... no
Qt Quick Controls 2:
  Styles ................................. Default Fusion Imagine Material Universal
Qt Quick Templates 2:
  Hover support .......................... yes
  Multi-touch support .................... yes
Qt Positioning:
  Gypsy GPS Daemon ....................... no
  WinRT Geolocation API .................. no
Qt Location:
  Geoservice plugins:
    OpenStreetMap ........................ yes
    HERE ................................. yes
    Esri ................................. yes
    Mapbox ............................... yes
    MapboxGL ............................. yes
    Itemsoverlay ......................... yes
Qt Multimedia:
  ALSA ................................... no
  GStreamer 1.0 .......................... no
  GStreamer 0.10 ......................... no
  Video for Linux ........................ yes
  OpenAL ................................. no
  PulseAudio ............................. no
  Resource Policy (libresourceqt5) ....... no
  Windows Audio Services ................. no
  DirectShow ............................. no
  Windows Media Foundation ............... no
Qt WebEngine:
  Embedded build ......................... yes
  Pepper Plugins ......................... no
  Printing and PDF ....................... no
  Proprietary Codecs ..................... no
  Spellchecker ........................... yes
  Native Spellchecker .................... no
  WebRTC ................................. no
  Use System Ninja ....................... no
  Geolocation ............................ yes
  Use v8 snapshot ........................ yes
  Use ALSA ............................... no
  Use PulseAudio ......................... no
  Optional system libraries used:
    re2 .................................. no
    icu .................................. no
    libwebp, libwebpmux and libwebpdemux . no
    opus ................................. no
    ffmpeg ............................... no
    libvpx ............................... no
    snappy ............................... no
    libsrtp .............................. no
    glib ................................. no
    zlib ................................. no
    minizip .............................. no
    libevent ............................. no
    jsoncpp .............................. no
    protobuf ............................. no
    libxml2 and libxslt .................. no
    lcms2 ................................ no
    png .................................. no
    harfbuzz ............................. no
  Required system libraries:
    fontconfig ........................... no
    dbus ................................. no
    nss .................................. no
    khr .................................. yes
    glibc ................................ yes
  Required system libraries for qpa-xcb:
    libdrm ............................... no
    xcomposite ........................... no
    xcursor .............................. no
    xi ................................... no
    xrandr ............................... no
    xtst ................................. no

(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)可以在-extprefix 路徑下找到生成的文件:

四、開發板再配置

(1)將編譯後的結果複製到開發板/home/pi目錄下,我的目錄是

         將extprefix目錄裏面的所有文件複製到樹莓派下:/home/pi/qt5101_32

         樹莓派下qt5101_32文件夾內容如圖:

(2)開發板qt庫路徑配置

 配置Qt的運行時環境,打開/etc/profile,在最後一行輸入一下內容:

export QTDIR=/home/pi/qt5101_32  #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

 更詳細的參數配置引用自:http://dev.t-firefly.com/thread-11659-1-1.html ,可作爲參考和理解(非必須步驟)

1. 用戶環境變量,每次登陸後生效:
打開/etc/default/locale,然後添加(這裏不能使用引用其他環境變量來定義路徑,如下文中$QT_ROOT)

QT_QPA_PLATFORM_PLUGIN_PATH=/home/firefly/qt5.8-arm/plugins
LD_LIBRARY_PATH=/home/firefly/gnueabihf/lib:/home/firefly/ffmpeg-arm/lib:/home/firefly/qt5.8-arm/lib:/home/firefly/opencvlib_noopengl/lib
#QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:tty=/dev/tty1
#QT_QPA_PLATFORM=vnc:size=1280x720
QT_QPA_PLATFORM=xcb
QT_QPA_FONTDIR=/usr/share/fonts/truetype/droid
QT_QPA_EVDEV_MOUSE_PARAMETERS=Intellimouse:/dev/input/event2
QT_QPA_EVDEV_KEYBOARD_PARAMETERS=Linuxinput:/dev/input/event3
QML_IMPORT_PATH=/home/firefly/qt5.8-arm/plugins/qml
QML2_IMPORT_PATH=/home/firefly/qt5.8-arm/plugins/qml

2. 全局環境變量(我這有問題,不一定生效)
打開/etc/profile, 然後添加

export QT_ROOT=/home/firefly/qarmlib
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export LD_LIBRARY_PATH=/home/firefly/gnueabihf/lib:/home/firefly/ffmpeg-arm/lib:$QT_ROOT/lib:$LD_LIBRARY_PATH
#export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:tty=/dev/tty1
#export QT_QPA_PLATFORM=vnc:size=1280x720
export QT_QPA_PLATFORM=xcb
export QT_QPA_FONTDIR=/usr/share/fonts/truetype/droid
export QT_QPA_EVDEV_MOUSE_PARAMETERS=Intellimouse:/dev/input/event2
export QT_QPA_EVDEV_KEYBOARD_PARAMETERS=Linuxinput:/dev/input/event3
export QML_IMPORT_PATH=$QT_ROOT/qml
export QML2_IMPORT_PATH=$QT_ROOT/qml

3. bash環境變量:每次在開發版內啓動虛擬shell,以ssh方式啓動shell時都會執行:
打開~/.bashrc加入和2. 全局環境變量一樣的東西。
這些環境變量需要稍微解釋一下:
LD_LIBRARY_PATH中:添加了qt,交叉工具鏈的庫,還有其他庫的搜索路徑。
QT_QPA_PLATFORM中:
linuxfb代表qt無視x11桌面,在framebuffer上直接繪圖。這種方式繪圖的話需要你首先進入純終端,也就是按ctrl+alt+f1~f6進入6個純終端,然後執行程序。如果你的板子按那個鍵沒反應,但是按ctrl+alt+f7能退出來,說明你的內核沒有純終端驅動。自己去找。tty=/dev/tty1參數代表qt繪圖在了哪個終端上。大家用linuxfb花屏就是因爲qt無視桌面進行繪圖。
vnc代表qt無視x11桌面,自行啓動一個vncserver,在vnc上繪圖。通過電腦的vnc viewer可以查看qt程序界面。這個在你能用x11的情況下可以徹底棄用。
xcb代表qt程序在x11桌面環境裏執行。
實際上還有個eglfs選項,那個跟opengl有關,我暫時不研究。
QT_QPA_FONTDIR: 指定qt默認字體路徑。如果你啓動程序發現沒有字顯示,那就是你沒有設置對這個路徑。
QT_QPA_EVDEV_MOUSE_PARAMETERS:用在linuxfb,eglfs裏,指定輸入設備,如果你用觸摸屏也會有個差不多的參數要指定。
QML_IMPORT_PATH:指定QML路徑。
詳細參數可以參考http://doc.qt.io/qt-5/embedded-linux.html

(3)刷新配置

source /etc/profile

這裏感覺很奇怪,樹莓派每次啓動之後這個/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_32/lib/

3)刷新

sudo ldconfig

(5)opengl、EGL等庫文件重新鏈接:

(a)與之前配置的sysroot文件夾保持一致,但是這裏在樹莓派系統中操作,操作的是樹莓派的系統文件,需要加sudo,以及對應路徑前面都有'/'

sudo mv /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup

sudo mv /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup

sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0

sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

sudo ln -s /opt/vc/lib/libbrcmEGL.so /opt/vc/lib/libEGL.so

sudo ln -s /opt/vc/lib/libbrcmGLESv2.so.2 /opt/vc/lib/libGLESv2.so

sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1

sudo ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2

五、測試

(1)在筆記本ubuntu16.04下配置kit套件

就不展開了,直接給出我的套件配置

(2)隨便找了一個qml的例子 ,選擇剛剛配置的kit套件

(3)在左下角選擇release,點錘子,構建

如果構建時,提示#include_next<stdlib.h>找不到 stdlib.h文件,那麼,可嘗試在.pro文件中加入一行:

QMAKE_CFLAGS_ISYSTEM=

 

(4)構建完成之後,複製到開發板上

(5)運行,運行時可在命令後加上-platform 選擇不同的平臺插件進行渲染

  • -platform linuxfb ,表示用linuxfb渲染,是純軟件渲染,但是在qt5.9之後的版本,被改成了只能在純命令行下啓動,即你先要按alt+ctrl+f1進入tty1,然後再運行程序。否則你的屏幕會花掉,等下給個示範圖
  • -platform xcb ,表示用xcb渲染,需要在啓動x11後纔可以用這個插件
  • -platform eglfs ,表示用eglfs硬件渲染,即利用opengl es2進行渲染,qml、qtquick2等程序只能在這個模式下才能完美運行,否則會出現界面缺陷
  • 關於更詳細的描述,請參見qt官方文檔:http://doc.qt.io/qt-5/embedded-linux.html

下面給出,在三個渲染插件下的運行qtquick2程序的情況: 

1)在x11界面下直接用linuxfb運行

如果 出現上圖情況,運行source /etc/profile 刷新一下即可

重新運行,出現下面的花屏

這就是前面提到的,qt5.9之後,linuxfb只能在純命令行下運行,下面給出我進入tty1後再次運行的情況:

看起來沒什麼問題,但是這是個qml程序,實際上這個界面是有缺陷的,少了按鈕的邊框

2)在xcb下運行:

要注意的是:xcb只能在x桌面下運行,否則會提示 Could not connect to X display

得到了與linuxfb一樣的效果,但是不用進入tty命令行,何樂而不爲?

3)用eglfs運行,由於eglfs不能在vnc啓動,用實際屏幕運行如下:

這纔是程序原來的面貌好嗎~~

關於傳統的qwidget程序,就不一一演示了,理論上3個渲染插件都可以跑的。


本文從各種配置到編譯到運行,都描述了一次,如果還有不夠詳細的地方,請在下方回覆。

關於顯示中文字體的問題,個人還沒有時間來研究,可暫時參見:https://licheezero.readthedocs.io/zh/latest/%E5%BA%94%E7%94%A8/QT_doc6.html#id6

本文的參考文章:

官方教程:https://wiki.qt.io/RaspberryPi2EGLFS

翻譯教程:https://blog.csdn.net/zz531987464/article/details/83218345

老外實踐教程:https://lb.raspberrypi.org/forums/viewtopic.php?t=204778

qmake.conf配置教程:http://www.tal.org/tutorials/building-qt-512-raspberry-pi

樹莓派系統直接編譯QT5.12教程:http://www.tal.org/tutorials/building-qt-512-raspberry-pi   【雖然不是交叉編譯教程,但是對於配置qt編譯環境很有用】

國人非樹莓派平臺交叉編譯qt5.9教程:http://dev.t-firefly.com/thread-11659-1-1.html 【很詳細,有參考價值】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章