手上接到一块树莓派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/
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
#!/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,然后执行该脚本。
到此编译环境准备完成。
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