编译平台 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. (偶尔更新)【Linux】Linux常见不常用命令收集

    本文时间 2023-05-20 作者:sugerqube漆瓷 cd,vi,clear这些属于常见常用命令本文不再赘述. 安装命令 yum install vim举例安装vim rpm -ivh a.r ...

  2. 2023-06-11:redis中,如何在100个亿URL中快速判断某URL是否存在?

    2023-06-11:redis中,如何在100个亿URL中快速判断某URL是否存在? 答案2023-06-11: 传统数据结构的不足 当然有人会想,我直接将网页URL存入数据库进行查找不就好了,或者 ...

  3. 一篇文章带你入门HBase

    本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 目录 HBase特性 Hadoop的限制 基本概念 NameSpace Table RowKey Column Time ...

  4. 【PAT】1001 害死人不偿命的(3n+1)猜想(动态更新)

    卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 年的世界 ...

  5. 【TVM模型编译】2. relay算子构造.md

    从TVM的官方Tutorial里面,介绍了如何新增自定义算子.(这是我翻译的) 之前的文章讲到了onnx 算子转换到Relay IR的过程 下面以Conv2d算子介绍,编译过程中 Relay IR是如 ...

  6. JetBrain学信网注册(Clion)

    一.打开网站 首先打开JetBrains关于学生认证的网站:https://www.jetbrains.com/shop/eform/students,可以看见以下页面: 二.人工验证 人工验证适合于 ...

  7. HTML前端js

    ajax请求方法书写 $.ajax({ type:"POST", url:CONTEXT_PATH+"/appAudit/insertSnDocCountAdmin&qu ...

  8. 【Vue】父子组件传值、方法引用

    父子组件值.方法引用 1.值 1.1 父组件获取子组件值 父组件 <template> <div> <button @click="getChildValue& ...

  9. 介绍一个简易的MAUI安卓打包工具

    介绍一个简易的MAUI安卓打包工具 它可以帮助进行MAUI安卓的打包. 虽然也是用MAUI写的,但是只考虑了Windows版本,mac还不太会. 没什么高级的功能,甚至很简陋,它能做的,只是节省你从M ...

  10. 【go语言】2.4.1 如何导入和使用包

    在 Go 语言中,包(package)是代码的组织方式.每个 Go 程序都由包构成,程序从 main 包开始运行. 导入包 使用 import 关键字可以导入包.导入的包可以是 Go 标准库中的包,也 ...