Zeke Xiao

Zeke Xiao

github

Qt5 armv8(aarch64) と WebEngine の交差コンパイル - NVIDIA JETSON TX2

コンパイルプラットフォーム 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:

上記の依存関係が不完全な場合、configure 後に 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/lib/aarch64-linux-gnu usr
rsync -avz -e ssh nvidia@192.168.12.232:/usr/aarch64-linux-gnu usr

一部の依存関係は実際にはシンボリックリンクであるため、パスを置き換える必要があります。

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 && chmod +x sysroot-relativelinks.py && vim sysroot-relativelinks.py:

#!/usr/bin/env python
import sys
import os

# sysrootディレクトリを受け取り、すべての絶対シンボリックリンクを相対リンクに変換します。
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, 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):
            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 が完了したら、警告やエラーがないことを確認します。依存関係の問題がある場合は、依存関係をインストールした後、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 以前ではネイティブスワップをサポートしていません。

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 を含むプログラムをコンパイルするには、webengineprocess と依存関係をプログラムディレクトリに持っていく必要があります。#

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
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。