编译平台 Windows10 WSL2 Debian,目标平台 NVIDIA JETSON TX2

(注:Ubuntu <= 16.04 会出现 libclang < 3.8 的问题)


下载源码

为避免网络问题,先安装一个下载工具,使用aria2可以断点继续下载

sudo apt install aria2

然后 cd 到一个工作目录

Qt 5.12.5 源码

aria2c https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/5.12/5.12.5/single/qt-everywhere-src-5.12.5.tar.xz
tar xf qt-everywhere-src-5.12.5.tar.xz

交叉编译工具 Linaro GCC

aria2c https://releases.linaro.org/components/toolchain/binaries/latest-5/aarch64-linux-gnu/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz
tar xf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz

在目标平台安装依赖

sudo apt-get install '.*libxcb.*' libxrender-dev libxi-dev \
libfontconfig1-dev libudev-dev libxkbcommon-dev \
libxkbcommon-x11-dev libc6-dev-arm64-cross libnss3-dev libicu-dev \
libdbus-1-dev

GLES 和 EGL

mkdir /home/nvidia/GLES
cd /home/nvidia/GLES
apt-get download libgles2-mesa-dev
ar x libgles2*.deb
tar -xvf data.tar.xz
mkdir /home/nvidia/EGL
cd /home/nvidia/EGL
apt-get download libegl1-mesa-dev
ar x libegl1*.deb
tar -xvf data.tar.xz
cd /home/nvidia/GLES/usr/include
sudo cp -r GLES2 GLES3 /usr/include
cd /home/nvidia/EGL/usr/include
sudo cp -r EGL KHR /usr/include

在本机安装依赖

sudo apt-get install -y 'libxcb.*' \
libx11-xcb-dev libglu1-mesa-dev \
libxrender-dev libxi-dev libinput* \
mtdev* mesa-utils \
mesa-utils-extra libgles2-mesa-dev ninja-build \
git rsync pkg-config gcc g++

ps:

以上依赖可能不全,如果 confugre 后提示 xxx 找不到,例如 xxx 找不到

通常可以直接 apt install libxxx-dev

有的库可能带有版本号,例如 libnss3-dev,可以使用 apt search xxx 搜索

安装后重新来一遍下面的全部内容

从目标平台拷贝依赖

这里的 ip 换成自己的 ip

rsync -avz -e ssh nvidia@192.168.12.232:/lib/aarch64-linux-gnu lib
rsync -avz -e ssh nvidia@192.168.12.232:/usr/include usr
rsync -avz -e ssh nvidia@192.168.12.232:/usr/lib usr
rsync -avz -e ssh nvidia@192.168.12.232:/usr/libaarch64-linux-gnu usr
rsync -avz -e ssh nvidia@192.168.12.232:/usr/aarch64-linux-gnu usr

因为有一些依赖实际上是一个symbol link,所以要替换路径

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py PATH_TO_YOUR_DIR

如果链接不到raw.githubusercontent.com建一个python脚本mkdir sysroot-relativelinks.py && chomod +x sysroot-relativelinks.py && vim sysroot-relativelinks.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)

运行 ./sysroot-relativelinks.py PATH_TO_YOUR_DIR

还要替换一个.a的库

ln -sf $PWD/usr/aarch64-linux-gnu/lib/libm.a $PWD/usr/lib/aarch64-linux-gnu/libm.a

编译

修改Qt make时include和lib的查找顺序

vim qt-everywhere-src-5.12.5/qtbase/mkspecs/devices/linux-jetson-tx1-g++/qmake.conf

注释掉 /usr/include

QMAKE_INCDIR_POST += \
# $$[QT_SYSROOT]/usr/include \
$$[QT_SYSROOT]/usr/include/aarch64-linux-gnu

调整LIBDIR和RPATHLIBKDIR的顺序,把/usr/lib/aarch64开头的放到/usr/lib的前面

QMAKE_LIBDIR_POST += \
$$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu \
$$[QT_SYSROOT]/usr/lib \
$$[QT_SYSROOT]/lib/aarch64-linux-gnu QMAKE_RPATHLINKDIR_POST += \
$$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra \
$$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu \
$$[QT_SYSROOT]/usr/lib \
$$[QT_SYSROOT]/lib/aarch64-linux-gnu

替换下面的 CROSS_COMPILE 路径为自己的gcc-linaro路径

prefix为安装路径(这个目录是使用交叉编译后的程序自动寻找的QT_DIR目录,当然会被环境变量覆盖)

extprefix为编译后目标主机 Qt 的路径

hostprefix为编译出来的交叉编译工具的路径

sysroot 为刚刚同步库文件的目录

cd qt-everywhere-src-5.12.5
./configure -shared -c++std c++14 \
-opensource -release --confirm-license -pkg-config \
-no-use-gold-linker \
-device linux-jetson-tx1-g++ \
-device-option CROSS_COMPILE=/home/linger/crossbuild/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- \
-sysroot /home/linger/crossbuild \
-nomake examples -nomake tests \
-prefix /home/linger/crossbuild/JetsonTX2/qt5 \
-extprefix /home/linger/crossbuild/JetsonTX2/qt5 \
-hostprefix /home/linger/crossbuild/JetsonTX2/qt5-host \
-opengl es2 \
-pch \
-skip qtwayland \
-skip qtscript \
-skip qtandroidextras \
-skip qtdoc \
-skip qtremoteobjects \
-skip qtlocation \
-make libs \
-no-gbm \
-no-glib \
-qt-libpng \
-qt-libjpeg \
-qt-harfbuzz \
-qt-freetype \
-qt-xcb

config完成后应没有warning和error,如果有依赖问题安装好依赖后删除config.cache重新configure

如果提示dbus有问题,在确认安装好libdbus-1-dev后

修改 DEPS/usr/lib/aarch64-linux-gnu/pkgconfig/dbus-1.pc

Libs 后面添加 -lpthread -lsystemd

编译安装

ps:

编译前确保(free -m)自己的内存+swap 大于 16G, 否则会在编译 chrominm 时挂掉

Linux swapfile 10G, count为大小, 目录位置没有限制,btrfs在kernel 5.0前不支持native swap

cd /var
sudo mkdir swap
sudo dd if=/dev/zero of=swapfile bs=1024 count=1024000
sudo mkswap swapfile
# 开启
sudo swapon /var/swapfile
# 关闭
sudo swapoff /var/swapfile

编译

make -j4
make install

如果编译过程中提示找不到 gn

# 需要代理:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
# 镜像:
git clone https://source.codeaurora.org/quic/lc/chromium/tools/depot_tools
export PATH=$PATH:PATH_TO_YOUR_depot_tools

安装

cd JetsonTX2
scp -r qt5 nvidia@192.168.12.232:/usr/local

添加环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/qt5/lib
export QT_PLUGIN_PATH=/usr/local/qt5/plugins
export QML_IMPORT_PATH=/usr/local/qt5/qml
export QML2_IMPORT_PATH=/usr/local/qt5/qml
export QT5_DIR=/usr/local/qt5

编译带 WebEngine 的程序需要把 webegnineprocess 和依赖带到程序目录下

qt-everywhere-src-5.12.5/qtwebengine/src/core/release下的qtwebengine_locales文件夹、qtwebengine_resources_开头的.pak文件、icudtl.dat

如果提示:

ERROR:zygote_host_impl_linux.cc(88)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

切换到非root用户或禁用 Sandbox:export QTWEBENGINE_DISABLE_SANDBOX=1

参考链接:

  1. QtWebBrowser fails to launch with QtLauncher Demo
  2. Cross-Compile the Qt Libraries for Nvidia Jetson TX2 and Set the QtCreator Environment
  3. Windows下定制编译QtWebEngine
  4. https://github.com/riscv/riscv-poky
  5. https://doc.qt.io/qt-5/configure-options.html
  6. https://forum.qt.io/topic/99978/a-suitable-version-of-nss-could-not-be-found-cross-compile-raspberry-pi3-qt5-10-1

交叉编译 Qt5.12 armv8(aarch64) 带 WebEngine - NVIDIA JETSON TX2的更多相关文章

  1. 【ARM-Linux开发】【CUDA开发】NVIDIA Jetson TX2 进阶:Nsight Eclipse Edition

    嵌入式平台:NVIDIA Jetson TX2 嵌入式系统:Ubuntu16.04 虚拟机系统:Ubuntu14.04 一.NSight简介 Jetpack开发工具为人工智能提供了一整套软件架构,包括 ...

  2. nvidia jetson tx2 刷机遇到的问题解决

    一.主要信息 使用的开发板:nvidia jetson tx2(内存8g有wifi的版本) 使用的JetPack版本: 4.2.2 二.遇到的问题及解决 1. 刷好jetson os 后,开发板一直在 ...

  3. 【ARM-Linux开发】【CUDA开发】NVIDIA Jetson TX2 进阶:QtCreator安装

    Here we have a short article on installing Qt Creator on the NVIDIA Jetson TX1. Looky here: Note: Th ...

  4. NVIDIA Jetson TX2刷机

    官方安装教程 JetPack下载 主机端环境准备 需要在PC端安装虚拟机,虚拟机中安装Ubuntu14.04系统. 按照上面的地址下载JetPack-L4T-3.1-linux-x64.run 主机端 ...

  5. Nvidia Jetson TX2开发板学习历程(1)- 详细开箱、上电过程

    考试周已经结束了,开发板也已经到了.希望借着这个假期能够好好的利用这块开发板学习Linux系统以及Tensorflow的相关知识. 我打算将学习历程通过博客的方式写出来,作为自己的笔记,也可以供以后拿 ...

  6. Nvidia Jetson TX2开发板学习历程( 2 )- 更换pip源,提高下载速度

    通过将pip的源更换为国内源,来提高下载速度,这也将成为今后学习过程下载Python包的基础,建议前期一定要完成! 知名的国内源 清华:https://pypi.tuna.tsinghua.edu.c ...

  7. NVIDIA TX2--3--NVIDIA Jetson TX2 查看系统版本参数状态及重要指令

    NVIDIA Jetson TX2 查看系统参数状态. 当前博主的TX2更新的版本为:Jetpack 3.3, cuda 9.0.252, cudnn7.0, opencv3.3.1, TensorR ...

  8. Qt5.12.0交叉编译

    Qt5.12.0 交叉编译 源码配置 修改 qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 文件 MAKEFILE_GENERATOR = UNIX C ...

  9. Qt5.12.2开发Android环境搭建

    Qt-Android开发环境概要qt-opensource-windows-x86-5.12.2----armv7jdk-8u201-windows-x64android-ndk-r18b-windo ...

  10. Ubuntu18.10下安装Qt5.12过程记录

    首先你得先安装Ubuntu操作系统(我是在VMWare14中安装的Ubuntu18.10版本). 阿里镜像:https://opsx.alibaba.com/mirror 我这里下载的文件为:ubun ...

随机推荐

  1. 2014年蓝桥杯C/C++大学B组省赛真题(六角填数)

    题目描述: 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 分析:先将a数组初始化为1-12 ...

  2. Sublime Text Windows/Linux平台快捷键

    编辑 按键 对应命令 Ctrl + X 删除行 Ctrl + 行后插入 Ctrl + ⇧ + 行前插入 Ctrl + ⇧ + ↑ 上移文本/选择 Ctrl + ⇧ + ↓ 下移文本/选择 Ctrl + ...

  3. 00.XML入门

    0.了解XML Extensible Markup Language 可扩展标记语言 申明信息不算元素,左图中book为根元素,根元素有且仅有一个; 1.初识XML 1.3用IDE创建xml(以ecl ...

  4. 使用 ChatGPT 的 7 个技巧 | Prompt Engineering 学习笔记

    概述 前段时间在 DeepLearning 学了一门大火的 Prompt 的课程,吴恩达本人授课,讲的通俗易懂,感觉受益匪浅,因此在这里总结分享一下我的学习笔记. 为什么要学习 Prompt ? 因为 ...

  5. 生信服务器 | Linux 时间戳和标准时间

    在 Linux 系统中,有许多场合都使用时间戳的方式表示时间,即从1970年1月1日起至当前的天数或秒数.如/etc/shadow里的密码更改日期和失效日期,还有代理服务器的访问日志对访问时间的记录等 ...

  6. 强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验

    强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述.序列决策.动作空间定义.策略价值函数.探索与利用.Gym强化学习实验 1.强化学习核心概念 强化学习(reinforcement le ...

  7. Pinot2的开发者社区和教程

    目录 文章背景: Pinot 2 是任天堂公司于2018年发布的一款游戏机,采用了基于马里奥兄弟游戏<塞尔达传说:荒野之息>的开放世界操作系统,并推出了许多创新的功能,例如"超级 ...

  8. 如何制作 GitHub 个人主页

    人们在网上首先发现你的地方是哪里?也许你的社交媒体是人们搜索你时首先发现的东西,亦也许是你为自己创建的投资组合网站.然而,如果你使用GitHub来分享你的代码并参与开源项目,那么你的GitHub个人主 ...

  9. 【SpringBoot】Session共享

    本文参考 Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了! 在传统的单服务架构中,只有一个服务器,那就不会存在session共享的问题,但如果在分布式/集群项目中, ...

  10. Java_Day16_作业

    A:简答题 1.请把我们讲解过的所有类中的方法在API中找到,并使用自己的话进行描述 答案: Map public V put(K key, V value): public void clear() ...