5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Qtクロスコンパイル開発環境の構築(Jetson TX1向け)

Last updated at Posted at 2018-08-17

ホスト環境

Linux (Ubuntu 16.04 LTS) ※Jetpack導入済

追記: Ubuntu 20.04でも動作確認済

デバイス(Jetson)側の準備

依存パッケージのインストールをしておく。

sudo apt-get install '.*libxcb.*' libxrender-dev libxi-dev libfontconfig1-dev libudev-dev

# EGLFSが有効にならない場合
sudo apt install libgles2-mesa-dev -y

# Gstreamerを有効にする場合
sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-* libgstreamer-plugins-base1.0-dev

Qt5.12でQtWebEngineを使う場合は以下のパッケージもインストールしておく。

sudo apt-get install gperf bison flex

ホスト(Ubuntu)側の準備

ホストPCのLinux_for_Tegraのrootfs/usrディレクトリに移動する。
rsyncを使いJetsonからincやlibをコピーする。(IPアドレスはJetsonのIPアドレスを指定する)

cd ~/64_TX1/Linux_for_Tegra/rootfs/usr
sudo rsync -e ssh -avz nvidia@192.168.11.4:/usr/include .
sudo rsync -e ssh -avz nvidia@192.168.11.4:/usr/lib .

以下のスクリプトを利用し、ホスト側にコピーしたシンボリックリンクをホスト向けに修正する。
https://github.com/alpqr/fixsymlinks_tx1

chmod +x fixsymlinks.sh
sudo ./fixsymlinks.sh ~/64_TX1/Linux_for_Tegra/rootfs

Qtソースの入手

Qt(オープンソース版)をダウンロードして展開する。
インストールするバージョンはLTSの5.9.6にした(現時点で最新LTS)。
https://download.qt.io/official_releases/qt/5.9/5.9.6/single/qt-everywhere-opensource-src-5.9.6.zip.mirrorlist

※5.12.10でも動作確認済

xz -dc qt-everywhere-opensource-src-5.9.6.tar.xz | tar xfv -
mv qt-everywhere-opensource-src-5.9.6 ~/

ツールチェーンのダウンロード

以下からlinaroをダウンロードする。現在最新版は7.3.1。展開して移動する。
https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/

xz -dc gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz | tar xfv -
mv gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu ~/64_TX1/

Qtをビルド

qt-everywhere-opensource-src-5.9.6フォルダ配下で、以下を実行する。
※ QMAKE_CFLAGS_ISYSTEM=は、GCCの仕様変更に対応するために追加した。詳細はこちらのバグレポートを参照。

cd ~/qt-everywhere-opensource-src-5.9.6
./configure -device linux-jetson-tx1-g++ -device-option CROSS_COMPILE=$HOME/64_TX1/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -sysroot $HOME/64_TX1/Linux_for_Tegra/rootfs -nomake examples -nomake tests -prefix /usr/local/qt5 -extprefix $HOME/64_TX1/qt5 -hostprefix $HOME/64_TX1/qt5-host -opengl es2 QMAKE_CFLAGS_ISYSTEM=

追記: 以下の方法でコンパイルオプションを変更することでもビルド可能(この場合はQMAKE_CFLAGS_ISYSTEM指定は不要)
https://forums.developer.nvidia.com/t/xavier-qt-cross-compile/154215/3?u=otomon

# コンパイルオプションを変更
edit $HOME/qt-everywhere-src-5.12.10/qtbase/mkspecs/common/gcc-base.conf
Change QMAKE_CFLAGS_ISYSTEM = -isystem to QMAKE_CFLAGS_ISYSTEM = -I

Also, insert the following lines in the qmake.conf of the device:
QMAKE_CXXFLAGS += -std=gnu++11
QMAKE_CFLAGS_ISYSTEM=-I
(qtbase/mkspecs/devices/linux-jetson-tx1-g++/qmake.conf)

# configure
./configure -opensource -confirm-license -device linux-jetson-tx1-g++ -device-option CROSS_COMPILE=$HOME/64_TX1/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -sysroot $HOME/64_TX1/Linux_for_Tegra/rootfs -nomake examples -nomake tests -prefix /usr/local/qt5 -extprefix $HOME/64_TX1/qt5 -hostprefix $HOME/64_TX1/qt5-host -opengl es2

商用版かオープンソース版かを聞かれるので、オープンソース版を選択する。oを入力する。

Type 'c' if you want to use the Commercial Edition.
Type 'o' if you want to use the Open Source Edition.

Which edition of Qt do you want to use? o

yを押してライセンスに受領する。

This is the Qt Open Source Edition.
 
You are licensed to use this software under the terms of
the GNU Lesser General Public License (LGPL) version 3
or the GNU General Public License (GPL) version 2.
 
Type 'L' to view the GNU Lesser General Public License version 3 (LGPLv3).
Type 'G' to view the GNU General Public License version 2 (GPLv2).
Type 'y' to accept this license offer.
Type 'n' to decline this license offer.
 
Do you accept the terms of either license? y

QPA backendsのEGLFSとEGL on X11に依存するので、これらがyesになっていることを確認する。

Qt Gui:
  Accessibility .......................... yes
  FreeType ............................... yes
    Using system FreeType ................ yes
  HarfBuzz ............................... yes
    Using system HarfBuzz ................ no
  Fontconfig ............................. yes
  Image formats:
    GIF .................................. yes
    ICO .................................. yes
    JPEG ................................. yes
      Using system libjpeg ............... no
    PNG .................................. yes
      Using system libpng ................ yes
  EGL .................................... yes
  OpenVG ................................. no
  OpenGL:
    Desktop OpenGL ....................... no
    OpenGL ES 2.0 ........................ yes
    OpenGL ES 3.0 ........................ yes
    OpenGL ES 3.1 ........................ yes
  Session Management ..................... yes
Features used by QPA backends:
  evdev .................................. yes
  libinput ............................... no
  INTEGRITY HID .......................... no
  mtdev .................................. no
  tslib .................................. no
  xkbcommon-evdev ........................ no
QPA backends:
  DirectFB ............................... no
  EGLFS .................................. yes
  EGLFS details:
    EGLFS OpenWFD ........................ no
    EGLFS i.Mx6 .......................... no
    EGLFS i.Mx6 Wayland .................. no
    EGLFS RCAR ........................... no
    EGLFS EGLDevice ...................... yes
    EGLFS GBM ............................ no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... no
    EGL on X11 ........................... yes
  LinuxFB ................................ yes
  VNC .................................... yes
  Mir client ............................. no
  X11:
    Using system-provided XCB libraries .. yes
    EGL on X11 ........................... yes
    Xinput2 .............................. yes
    XCB XKB .............................. yes
    XLib ................................. yes
    XCB render ........................... yes
    XCB GLX .............................. yes
    XCB Xlib ............................. yes
    Using system-provided xkbcommon ...... no
Qt Widgets:
  GTK+ ................................... no
  Styles ................................. Fusion Windows

ビルドして、インストールする。(一時間程度かかる)

make -j8
make install

installすると、
$HOME/64_TX1/qt5配下に、デバイス側(Jetson)と同期させるディレクトリが作られる。
$HOME/64_TX1/qt5-host配下に、ホスト向けのツールのディレクトリが作られる。

デバイス側(Jetson)で、同期させる/usr/local/qt5ディレクトリを作成する。

sudo mkdir /usr/local/qt5
sudo chown nvidia:nvidia /usr/local/qt5

ホスト側で以下のコマンドを入力し、qt5ディレクトリを同期する。

cd ~/64_TX1
rsync -e ssh -avz qt5 nvidia@192.168.11.4:/usr/local

(参考)
上記ではすべてのQtモジュールを追加しているが、一部のみ追加する場合は追加したいモジュールのディレクトリでqmake、make、make installし、qt5フォルダをrsyncすれば良い。
QtMultimediaを追加する場合は以下の通り。

cd ~/qt-everywhere-opensource-src-5.9.6/qtmultimedia
~/64_TX1/qt5-host/bin/qmake
make -j8
make install

cd ~/64_TX1
rsync -e ssh -avz qt5 nvidia@192.168.11.4:/usr/local

Qtアプリケーションのビルド

Qtのサンプルアプリケーションをビルドする。qmakeでMakefileを作成してmakeする。

cd ~/qt-everywhere-opensource-src-5.9.6/qtbase/examples/opengl/qopenglwidget
~/64_TX1/qt5-host/bin/qmake
make

scpを利用してJetsonに実行ファイルをコピーする。

scp qopenglwidget nvidia@192.168.11.4:/home/nvidia

Qtアプリケーションの実行

マウスやキーボードは/dev/inputを通して利用するが、権限がないのでそのままでは使えない。
一時的に権限を追加する場合は以下のコマンドを打つ。

sudo chmod a+rwx /dev/input/event*

恒久的な対処を行う場合は、udevルールを追加する。

sudo vi /etc/udev/rules.d/99-input.rules

KERNEL=="event*", NAME="input/%k", MODE="666"
を書いて保存する

ライブラリのパスを設定し、実行する。

export LD_LIBRARY_PATH=/usr/local/qt5/lib
cd ~
./qopenglwidget

Screenshot from 2018-08-17 10-55-00.png

マウスカーソルがQtとX11とで2つ表示されてしまう。
X11側のマウスを非表示にする場合は、以下の通り対処する。(注意:恒久的に非表示にされる)

sudo vi /usr/share/lightdm/lightdm.conf.d/50-xserver-command.conf

xserver-command=X -core
を
xserver-command=X -core -nocursor
に変更する。

Qt Creatorの設定

コマンドラインで毎回操作するのは面倒なので、Qt Creatorを使ってクロスビルド、リモートデバッグができるようにする。
以下よりQt Creatorをダウンロードする。現在最新版は4.7.0。
https://download.qt.io/official_releases/qtcreator/4.7/4.7.0/qt-creator-opensource-linux-x86_64-4.7.0.run.mirrorlist

インストーラーを実行する。
インストールディレクトリはデフォルトの/home/ubuntu/qtcreator-4.7.0とした。

chmod +x qt-creator-opensource-linux-x86_64-4.7.0.run
./qt-creator-opensource-linux-x86_64-4.7.0.run

ホストPCでQt Creatorを起動する。
場所はhome/ubuntu/qtcreator-4.7.0/bin/qtcreatorにある。

まずは、クロスコンパイラを設定する。
ツールバーから、Tools>Optionsを選択してオプションメニューを表示する。
KitsメニューのCompilersタブを選択する。
Addボタンを押し、GCCのC++を追加する。
Nameを適宜設定し、コンパイラパスにg++を指定する。今回の手順の場合、以下のパスになる。
/home/ubuntu/64_TX1/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
同様に、GCCのCも追加する。
/home/ubuntu/64_TX1/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
ABIが自動設定されるので、変更せずにApplyを押す。
image.png

同様にデバッガも設定する。Debuggersタブを選択する。
Addボタンを押し、gdbのパスを設定してApplyを押す。今回の手順の場合、以下のパスになる。
/home/ubuntu/64_TX1/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb
image.png

Qtバージョン(qmake)を設定する。Qt Versionsタブを選択する。
Addボタンを押し、qmakeパスを設定してApplyを押す。今回の手順の場合、以下のパスになる。
/home/ubuntu/64_TX1/qt5-host/bin/qmake
image.png

キットを設定する。Kitsタブを選択する。Addボタンを押し、以下のとおりに設定する。
Name: TX1
Device type: Generic Linux Device
Sysroot: /home/ubuntu/64_TX1/Linux_for_Tegra/rootfs
Compiler: TX1-GCCおよびTX1-G++
Debugger: TX1-GDB
Qt Version:Qt 5.9.6 (qt5-host)
※デバイス設定をしていないため警告アイコンが出るが問題ない(下記手順後に消える)
image.png

次に、デバイス設定を追加する。
DevicesメニューのDevicesタブを選択し、Addボタンを押す。
image.png

Genelic Linux Deviceを選択して、Start Wizardボタンを押す。
image.png

JetsonのIPアドレス、ログインID、パスワードを入力し、Nextボタンを押す。
image.png

正常な場合、以下のメッセージ表示になる。
image.png

Qt Creatorからリモート実行・デバッグ

ツールバーのFile>Open File or Projectを選択し、サンプルプロジェクトを開く。
image.png

TX1キットのDebugとReleaseを選択し、Configure Projectボタンを押す。
image.png

ここで左下の緑色矢印を押してRunする。
Application Outputにて"Could not open display"と表示され実行できない場合は、Qt CreatorのProjecs、Run、Run Environment設定で、DISPLAY変数を追加し、値を:0として設定する。
image.png

再度実行する。
リモート実行できた。(RemminaでVNC接続して確認)
image.png

ブレークポイントを貼ってデバッグ実行、ちゃんとブレークする。
image.png

参考

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?