最新树莓派4B交叉编译Qt5.11.3【带opengl es2.0】

最新树莓派4B交叉编译Qt5.11.3【带opengl es2.0】

手上接到一块树莓派4B开发板裸板,需要研究开发板用来开发项目的可行性。于是零资料的情况开始研究之旅,好在前人栽树好乘凉,网上已经有很多的关于树莓派pi2,pi3资料,但是由于树莓派4B刚出来不久,所以没有太多对应的资料,不过也是大同小异。这里提供树莓派的官方网站地址:https://www.raspberrypi.org/

一、硬件环境

(1)硬件设备

	组装机:I3-8100,8G内存
	树莓派4B,armv8(64位),32Gsd卡

(2)系统环境

	VM虚拟机:ubuntu18.04 x64位
	树莓派4b:Raspbian Stretch 2019-07-13 【32位】

二、环境搭建

由于是交叉编译,编译过程会有一些依赖库需要用到树莓派系统上的,先搭建开发环境。
1.我们这里安装的是官方32位系统,编译器没用官方在github提供的编译器,使用的是开源ARM编译器:
https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/

  1. 在虚拟机上home目录建立工作目录,/home/xxxx/pi
  2. 下载qt5.11.3源码:http://download.qt.io/archive
  3. 把qt源码拷贝到pi目录解压
  4. 把编译器拷贝到pi目录并解压到tool目录,声明编译器环境变量。
  5. 这里因为需要用到树莓派的硬件加速,所以不用mesa的opengl库,编译过程需要用brcm的opengl库。
    用ssh登陆树莓派系统,打包如下目录 /lib、/opt/vc、/usr/include用sd卡拷贝出来放到虚拟机pi目录,并解压到sysroot目录。
  6. 移除mesa的opengl库文件,使用树莓派自带GPU加速库
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

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
  1. 在sysroot目录下新建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] + "")
    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)

加执行权限chmod +x sysroot.py,然后执行该脚本。
到此编译环境准备完成。

三、编译QT

1.进入源码目录,新建一个脚本,autoconfig.sh,内容如下。

#!/bin/sh  
./configure -prefix /home/qimi/pi/qt5.11.3 \
-extprefix qt5.11.3_arm \
-verbose \
-opensource \
-release \
-confirm-license \
-xplatform linux-arm-gnueabi-g++ \
-shared \
-qt-zlib \
-qt-libjpeg \
-qt-libpng \
-make libs \
-linuxfb  \
-no-cups \
-no-iconv \
-no-pch \
-no-opengl \
-opengl es2 \
-no-openssl \
-eglfs \
-skip qtlocation \
-skip qt3d \
-nomake examples \
-no-use-gold-linker \
-sysroot /home/xxxx/pi/sysroot \
-I/home/xxxx/pi/sysroot/opt/vc/include \
-L/home/qimi/pi/sysroot/opt/vc/lib

2.进入qtbase/mkspecs目录修改qmake.conf
针对pi2,pi3这里qt官方提供了devices目录进行不同设备的qmake.conf配置,这里由于pi4B是比较新的型号,qt并没有提供对应型号,因此使用通用arm编译配置,linux-arm-gnueabi-g++目录里面的qmake.conf

#
#qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/opt/vc/lib

QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/opt/vc/lib
QMAKE_LIBDIR_EGL        = $$[QT_SYSROOT]/opt/vc/lib
#QMAKE_LIBDIR_OPENVG     = $$QMAKE_LIBDIR_OPENGL_ES2

QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/opt/vc/include
QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL}
#QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}

QMAKE_LIBS_EGL          = -lbrcmEGL -lbrcmGLESv2
QMAKE_LIBS_OPENGL_ES2   = -lbrcmEGL -lbrcmGLESv2
#QMAKE_LIBS_OPENVG       = -lbrcmOpenVG

#QMAKE_LIBS_EGL          = -lEGL 
#QMAKE_LIBS_OPENGL_ES2   = -lGLESv2

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

DISTRO_OPTS += hard-float

#EGLFS_DEVICE_INTEGRATION = eglfs_kms

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

#modifications to g++.conf
QMAKE_CC                = /home/xxxx/pi/tools/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX               = /home/xxxx/pi/tools/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
QMAKE_LINK              = /home/xxxx/pi/tools/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = /home/xxxx/pi/tools/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++

#modifications to linux.conf
QMAKE_AR                = /home/xxxx/pi/tools/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = /home/xxxx/pi/tools/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM                = /home/xxxx/pi/tools/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP             = /home/xxxx/pi/tools/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-strip
load(qt_config)

到此,qt编译配置完成,chmod +x autoconfig.sh
执行:./autoconfig.sh

中间如果没有报错,那就恭喜你,配置成功,
接下来make –j4,中间可能会出现错误,可以在qt源码根目录下找到config.log,这个是configure配置时生成的日志,仔细分析错误原因,并逐一解决。
编译成功后,拷贝prefix目录下的相关qt库到虚拟机。把extprefix目录相关qt拷贝到树莓派系统。
在主机编译qt程序的时候可能会出现qmake not found,这是由于没有设置qtchooser导致, 修改/usr/lib/x86_64-linux-gnu/qtchooser/default ,或者把系统默认qmake目录软连接到你的qmake目录。

剩下的就是编写qt程序到树莓派运行了,这里就不再介绍了。

参考链接:

https://blog.csdn.net/dieju8330/article/details/86755000

https://blog.csdn.net/dieju8330/article/details/86743919

你可能感兴趣的:(qt/c++,c,c++,qt)