009 - 交叉编译 Qt5.12

交叉编译 Qt5.12

前言

之前我说了一句,就算板子性能再弱,编译需要的时间也不会比我配置交叉编译的时间久,这不,报应就来了,手上有一个性能弱到爆的Arm32机器,根本不可能在上面编译啊!!!所以不得不走上交叉编译的道路,这个版本是带 QtWebEngine 的

准备 sysroot

基础镜像

sysroot 基于 ubuntu 使用 qemu 搭建,根据《QEMU 模拟器定制根文件系统》一步一步来,先不要退出 qemu 环境

安装需要的依赖库

根据自己实际情况安装需要的支持库,当然全部装也只是大了那么一丢丢

# 交叉编译qt需要的库
apt install libssl-dev libnss3-dev libdbus-1-dev libfontconfig1-dev libfreetype6-dev
# opengles2
apt install libgles2-mesa-dev
# eglfs支持
apt install libgbm-dev libdrm-dev
# alsa开发库及其工具
apt install libasound2-dev alsa-utils
# pulseaudio开发库及服务
apt install libpulse-dev pulseaudio
# tslib
apt install libts-dev
# 键盘支持
apt install libxkbcommon-dev
# jpeg
apt install libjpeg-dev

安装自己要用的工具

根据自己需要的安装,也可以不装

# 平常需要用的工具
apt install unzip nmon rsync 
# killall工具
apt install psmisc
# hexdump insmod
apt install bsdmainutils kmod
# 编译工具
apt install build-essential cmake gdb gdbserver

创建 pkgconfig 软链接

不做这个的话,编译的时候 pkgconfig 找不到需要的库,也不知道有没有更好的解决方案

如果 /usr/lib/pkgconfig 目录不是空的,将里面的文件复制放到 /usr/lib/aarch64-linux-gnu/pkgconfig

/usr/lib/pkgconfig -> /usr/lib/aarch64-linux-gnu/pkgconfig

cd /usr/lib/
rm -r pkgconfig
ln -s aarch64-linux-gnu/pkgconfig pkgconfig

退出 qemu 环境

退出

exit

取消挂载

/m.sh -u ubuntu20/

处理软链接

系统里面有很多软链接写的是绝对路径,编译的时候找到的是主机的东西,那可不行哦

./c.py ubuntu20/

主机安装编译工具

交叉编译工具链

linaro 工具链

好像最新版本就只到7.5

https://releases.linaro.org/components/toolchain/binaries/

arm 工具链

这边就可以下载很新的版本

linaro下载页 可以看到,现在交叉编译工具链由Arm官方提供:ARM下载页

安装编译需要的环境

这些主要是 webengine 模块需要,具体根据 configure 输出,缺啥装啥就行

sudo apt install gperf bison flex python2

如果是 Arm32 的话,还需要安装以下的东西

sudo apt install gcc-multilib g++-multilib

编译Qt

这里以 aarch64 为例,arm 同理

配置 mkspecs

vim qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf

根据自己的交叉编译工具链实际地址修改,最终我的版本如下,写的全路径

#
# qmake configuration for building with aarch64-linux-gnu-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

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

# modifications to g++.conf
QMAKE_CC          = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
QMAKE_CXX         = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK        = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB  = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

# modifications to linux.conf
QMAKE_AR          = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY     = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy
QMAKE_NM          = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm -P
QMAKE_STRIP       = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip
load(qt_config)

configure

# -sysroot 指定sysroot,需要全路径
# -xplatform 指定交叉编译使用的mkspecs
./configure -prefix /opt/qt-5.12.10 -sysroot /home/kylin/Documents/aarch64/ubuntu20\
    -xplatform linux-aarch64-gnu-g++ -opensource -confirm-license -fontconfig -system-freetype\
    -no-xcb -no-glib -opengl es2 -egl -eglfs -linuxfb -nomake tests -nomake examples

make

make -j$(nproc)

make install

sudo make install -j$(nproc)

WebEngine

有些时候上述操作并没有编译 webengine 模块,手动搞他

cd qtwebengine
../qtbase/bin/qmake
make -j$(nproc)
sudo make install -j$(nproc)

去掉qt库交叉编译信息

如果需要在目标板上编译qt程序,就进行这一步,不然就完全不需要看这一节的内容哈

cd opt/qt-5.12.10
./convert2target.sh

目前遇到的问题

eglfs

Could not open egl display

确保编译的时候 EGLFS details 下面有yes

EGLFS .................................. yes
EGLFS details:
  EGLFS OpenWFD ........................ no
  EGLFS i.Mx6 .......................... no
  EGLFS i.Mx6 Wayland .................. no
  EGLFS RCAR ........................... no
  EGLFS EGLDevice ...................... no
  EGLFS GBM ............................ yes
  EGLFS VSP2 ........................... no
  EGLFS Mali ........................... no
  EGLFS Raspberry Pi ................... no
  EGL on X11 ........................... no

Could not queue DRM page flip on screen xxx

export QT_QPA_EGLFS_ALWAYS_SET_MODE=1

qmake

qmake 编译时架构是宿主机的,不能直接在板子上运行,现在我的解决方案就是在板子上编一遍,然后 install 之后就会有 qmake 这些工具了,也不知道有没有更好的解决方案

cd ${BUILD_DIR}
${QT_SRC_DIR}/configure ...
make -C ${BUILD_DIR}/qtbase/src sub-bootstrap qmake sub-moc sub-rcc sub-uic

附件

附件1 c.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)

附件2 convert2target.sh 脚本

#!/bin/bash

function convert() {
    for file in $1; do
        sed -i "s%/home/kylin/Documents/aarch64/ubuntu20%%g" "$file"
    done
}

files=$(ls mkspecs/*.pri)
convert "$files"

files=$(ls mkspecs/modules/*.pri)
convert "$files"

files=$(ls lib/*.prl)
convert "$files"

files=$(ls lib/*.la)
convert "$files"

files=$(ls lib/cmake/*/*.cmake)
convert "$files"

files=$(ls lib/pkgconfig/*.pc)
convert "$files"

由于个人水平有限,文中若有不合理或不正确的地方欢迎指出改正

若文中个人文章链接打不开,请在站内寻找同名文章

文章可能更新不及时,请以个人博客处文章为准

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一种广泛使用的跨平台应用程序框架。本文将介绍如何在Ubuntu 18.04上交叉编译Qt 5.12.7的详细教程。 第一步是安装必要的依赖项。打开终端并输入以下命令: sudo apt-get update sudo apt-get install build-essential perl python git p7zip-full 接下来,你需要安装交叉编译工具链。在此示例中,我们将以ARM Cortex-A7为目标平台。 sudo apt-get install g++-arm-linux-gnueabihf libc6-armhf-cross-armel-cross binutils-arm-linux-gnueabihf 然后,创建一个新的目录并切换到该目录中,然后从Qt官方网站上下载最新的Qt源代码: mkdir qt-cross-compile && cd qt-cross-compile wget https://download.qt.io/archive/qt/5.12/5.12.7/single/qt-everywhere-src-5.12.7.tar.xz tar xvf qt-everywhere-src-5.12.7.tar.xz 接下来,创建一个称为“qt5-armhf.conf”的新文件,需要根据目标平台进行相应的更改: cd qt-everywhere-src-5.12.7/qtbase/mkspecs cp -r linux-arm-gnueabi-g++/ qt5-armhf cd qt5-armhf vi qmake.conf 确保以下行已正确配置: 将“QMAKE_CFLAGS”和“QMAKE_CXXFLAGS”修改为: QMAKE_CFLAGS = -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard --sysroot=/usr/arm-linux-gnueabihf/ QMAKE_CXXFLAGS = $$QMAKE_CFLAGS 对于“QMAKE_LINK”和“QMAKE_LINK_SHLIB”,添加以下行: QMAKE_LINK = arm-linux-gnueabihf-g++ QMAKE_LINK_SHLIB = $$QMAKE_LINK 接下来,进入Qt源代码目录并构建一个交叉编译版本: cd ../../.. ./configure -prefix /opt/qt5-armhf -static -opensource -confirm-license -release -skip webengine -skip wayland -skip qtgamepad make -j4 接下来,安装Qt到目标目录: sudo make install 完成后,你可以在目标文件夹/opt/qt5-armhf找到已安装的Qt库。现在你可以使用Qt Creator或手动创建项目并在Ubuntu 18.04中进行交叉编译

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值