ホスト環境
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
マウスカーソルが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を押す。
同様にデバッガも設定する。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
Qtバージョン(qmake)を設定する。Qt Versionsタブを選択する。
Addボタンを押し、qmakeパスを設定してApplyを押す。今回の手順の場合、以下のパスになる。
/home/ubuntu/64_TX1/qt5-host/bin/qmake
キットを設定する。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)
※デバイス設定をしていないため警告アイコンが出るが問題ない(下記手順後に消える)
次に、デバイス設定を追加する。
DevicesメニューのDevicesタブを選択し、Addボタンを押す。
Genelic Linux Deviceを選択して、Start Wizardボタンを押す。
JetsonのIPアドレス、ログインID、パスワードを入力し、Nextボタンを押す。
Qt Creatorからリモート実行・デバッグ
ツールバーのFile>Open File or Projectを選択し、サンプルプロジェクトを開く。
TX1キットのDebugとReleaseを選択し、Configure Projectボタンを押す。
ここで左下の緑色矢印を押してRunする。
Application Outputにて"Could not open display"と表示され実行できない場合は、Qt CreatorのProjecs、Run、Run Environment設定で、DISPLAY
変数を追加し、値を:0
として設定する。
再度実行する。
リモート実行できた。(RemminaでVNC接続して確認)
ブレークポイントを貼ってデバッグ実行、ちゃんとブレークする。
参考