AR# 59172

PetaLinux - Qt 4.8.5、Qwt 6.1.0、および Qt Creator 3.0 を使用したアプリケーションの構築と展開

説明

Qt は、エンベデッド システム開発に適したアプリケーション フレームワークです。 Linux でフレーム バッファーに直接アクセスすることにより GUI およびエンベデッド グラフィックスに対するフレームワークを提供するだけでなく、マルチスレッド、ネットワーキング、データベース相互作用などの豊富な機能を含むフレームワーク スイートでもあります。ザイリンクスの Zynq 用ターゲット リファレンス デザイン (TRD) は、Qwt (Qt Widgets for Technical Applications) プラグイン付きの Qt フレームワーク上に構築されます。この資料では、ライブラリを構築して PetaLinux へと統合し、PetaLinux 2013.10 の Zynq 用 Qt プラットフォームでソフトウェアを開発する方法を説明します。

ソリューション

TRD では Qt フレームワークをフル活用しますが、Qt は PetaLinux の標準インストールの一部ではないため、別途にダウンロードして構築する必要があります。Qt フレームワークは、PetaLinux ルート ファイル システムに含めないと使用できません。現時点における Qt、Qwt、Qt Creator、および PetaLinux の最新バージョンは、次のとおりです。

アプリケーション/ライブラリ バージョン ダウンロード用ウェブサイト
Qt 4.8.5 http://www.qt-project.org
Qwt 6.1.0 http://qwt.sourceforge.net
Qt Creator 3.0.0 http://www.qt-project.org
PetaLinux 2013.10

http://japan.xilinx.com

Qt を PetaLinux システムに統合するには、フレーム バッファー インターフェイスを提供するディスプレイ コントローラー (Xylon LogiCVC-ML ビデオ ディスプレイ コントローラーなど) を使用して PetaLinux をコンフィギュレーションする必要があります。ディスプレイ コントローラー IP を構築し、その IP を使用するようにカーネルをコンフィギュレーションする方法は、このチュートリアルに含まれていません。コンパイルの手順をスキップする場合は、このアンサーの表内のリンクをクリックして PetaLinux Qt 4.8.5 プラグインをダウンロードし、「PetaLinux との統合」セクションに進んでください。また、このアンサーでは、PetaLinux ビルド システムによって TCSH および BASH が PetaLinux ターゲットで使用されるものと想定しています。そうでない場合は、適切な修正をコマンド例/サンプルに加えてください (コマンド例/サンプルはデフォルトであり、修正する必要はほとんどありません)。

構築の準備

ライブラリをクロスコンパイルするには、コマンド パス (例 : $PATH) にクロスコンパイラーが存在している必要があります。このチュートリアルでは、ザイリンクス SDK に含まれる CodeSourcery ツールチェーンを一般的なコンパイラーとして使用しています。別のコンパイラーを使用する場合は、提供されている例で構文の修正を適切に行う必要があります。コンパイラーをセットアップするには、コマンド パスに arm-xilinx-linux-gnueabi-* ツールがあり、$CROSS_COMPILE 環境変数が適切に定義されていることを確認します。

build> setenv PATH $XILINX_SDK/gnu/arm/lin/bin:${PATH}

また、ライブラリのクロスコンパイル、およびインストール前にステージング エリアへの移動のためのディレクトリ構造を作成する必要もあります。ディレクトリを次のように作成します。

$WORK_DIR/
+-> Qt/
+-> build/
+-> install/

Qt および Qwt インストール ファイルを Qt/build ディレクトリにダウンロードします。Qt をダウンロードする際には Qt for Embedded Linux を選択するようにしてください (エンベデッド デバイスでカーネル フレーム バッファーと直接やり取りするのに必要な追加のファイルが含まれているため)。また、この段階では Qt5 をダウンロードしないでください。Qt5 には、OpenGL グラフィックス処理が必要になりますが、これは Zynq の場合は追加 IP を使用しないと利用できません。 2 つのファイルがダウンロードされているはずです。

qt-everywhere-opensource-src-4.8.5.tar.gz
qwt-6.1.0.tar.bz2

Qt の構築

ライブラリ自体にそれぞれのクロスコンパイル環境 (エンベデッド ARM を含む) 用の mkspecs (ビルド仕様) があるので、メイン Qt ライブラリの構築は簡単です。ただし、コンパイラーの名前は例とは若干異なるため、ビルド スクリプトを少し変更する必要があります。

まず最初に、アーカイブを抽出します。

build> cd $WORK_DIR/Qt/build
build> tar -zxvf qt-everywhere-opensource-src-4.8.5.tar.gz
build> cd qt-everywhere-opensource-src-4.8.5

Qt のインストール パスを含めるために、ヘルパー環境変数も定義します。

build> setenv ZYNQ_QT_INSTALL ${WORK_DIR}/Qt/install

ここで、Qt コンフィギュレーション ファイルを qws/linux-arm-gnueabi-g++ ビルド ターゲットに対して編集する必要があります。このファイルをテキスト エディターで開くと、参照されているコンパイラーが arm-none-linux-gnueabi-* になっていることが確認できます。このコンパイラー名を検索し、arm-xilinx-linux-gnueabi-* ですべて置換します。

mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf

また、後続の qmake プロジェクトが正しく構築されるようにするために、qmake ユーティリティに対する命令を追加する必要があります。編集が完了したファイルは次のようになります ($ZYNQ_QT_INSTALL 変数を恒久的に設定しない場合は、ハードコードされた実際のパスで置換する)。 変更および追加部分は赤色で記述されています。

#
# qmake configuration for building with arm-xilinx-linux-gnueabi-g++
#
include(../../common/gcc-base-unix.conf) include(../../common/g++-unix.conf) include(../../common/linux.conf) include(../../common/qws.conf)
# modifications to g++.conf QMAKE_CC = arm-xilinx-linux-gnueabi-gcc QMAKE_CXX = arm-xilinx-linux-gnueabi-g++ QMAKE_LINK = arm-xilinx-linux-gnueabi-g++ QMAKE_LINK_SHLIB = arm-xilinx-linux-gnueabi-g++
# modifications to linux.conf QMAKE_AR = arm-xilinx-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-xilinx-linux-gnueabi-objcopy
QMAKE_STRIP = arm-xilinx-linux-gnueabi-strip
QMAKE_CFLAGS="-I$(ZYNQ_QT_INSTALL)/include -DZYNQ"
QMAKE_CXXFLAGS="-Wno-psabi -I$(ZYNQ_QT_INSTALL)/include -DZYNQ"
QMAKE_LFLAGS="-L$(ZYNQ_QT_INSTALL)/lib"

load(qt_config)

これらの変更を行ったら、Qt 用のコンフィギュレーション ユーティリティを実行します。この資料に含まれているあらかじめ構築されたライブラリは、これらの設定を使用して構築されていますが、他にも多数あります。使用可能なスイッチのリストは、Qt Project のウェブサイトおよび Qt の資料をご覧ください。

build> ./configure -embedded arm \
-xplatform qws/linux-arm-gnueabi-g++ \ -little-endian \ -opensource \
-host-little-endian \
-confirm-license \ -nomake demos \ -nomake examples \ -prefix $ZYNQ_QT_INSTALL

コンフィギュレーションが完了したら、ライブラリを構築してインストールできます。

build> make
build> make install

これで Qt ビルドが完了し、ステージング エリアにコピーされます。

注記 : エンベデッド システム用の Qt では、非標準の方法でフォントが処理されます。フォントの標準セットは、$ZYNQ_QT_INSTALL/lib/fonts にインストールされます。また、このディレクトリへのパスは、ライブラリ自体にハードコードされます。Qt アプリケーションは、ターゲット エンベデッド システムにインストールされると $WORK_DIR/Qt/install/lib/fonts で検索を行い、このディレクトリが見つからない場合はエラーになります (見つからない場合が多い)。このエラーは、ターゲット アーキテクチャで $QT_QWS_FONTDIR 環境変数を設定することにより修正できます (詳細は、「PetaLinux との統合」セクションで説明)。

Qwt (Qt Widgets for Technical Applications) の構築

Qwt は Qt よりも小さいライブラリであるため、より高速に構築してインストールできます。また、Qt ビルド メカニズムを活用するため、利用しやすくなっています。Qt ビルドからの設定を再利用できるので、コンパイラー設定を編集する必要はありません。ただし、Qt ビルド ツールがパス上にあることを確認することは必要です。

build> setenv PATH ${ZYNQ_QT_INSTALL}/bin:$PATH

次の手順では、ビルド ディレクトリに変更して Qwt ソースを抽出します。

build> cd $WORK_DIR/Qt/build
build> tar -jxvf qwt-6.1.0.tar.bz2
build> cd qwt-6.1.0

Qwt には、エンベデッド システムに対して正しくコンパイルされない追加のライブラリやプラグインなどがいくつか含まれているため、Qwt ルート ディレクトリの qwtconfig.pri ファイルを編集する必要があります。編集が完了したファイルは次のようになります (上記と同じく、デフォルトからの変更部分は赤色で記述されている)。

################################################################
# Qwt Widget Library
# Copyright (C) 1997   Josef Wilgen
# Copyright (C) 2002   Uwe Rathmann
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the Qwt License, Version 1.0
################################################################
QWT_VER_MAJ = 6 QWT_VER_MIN = 1 QWT_VER_PAT = 0 QWT_VERSION = $${QWT_VER_MAJ}.$${QWT_VER_MIN}.$${QWT_VER_PAT}
###################################################################### # Install paths ######################################################################
QWT_INSTALL_PREFIX = $$[QT_INSTALL_PREFIX]
unix { QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION }
win32 { QWT_INSTALL_PREFIX = C:/Qwt-$$QWT_VERSION }
QWT_INSTALL_DOCS = $${QWT_INSTALL_PREFIX}/doc QWT_INSTALL_HEADERS = $${QWT_INSTALL_PREFIX}/include QWT_INSTALL_LIBS = $${QWT_INSTALL_PREFIX}/lib
###################################################################### # Designer plugin # creator/designer load designer plugins from certain default # directories ( f.e the path below QT_INSTALL_PREFIX ) and the # directories listed in the QT_PLUGIN_PATH environment variable. # When using the path below QWT_INSTALL_PREFIX you need to # add $${QWT_INSTALL_PREFIX}/plugins to QT_PLUGIN_PATH in the # runtime environment of designer/creator. ######################################################################
QWT_INSTALL_PLUGINS = $${QWT_INSTALL_PREFIX}/plugins/designer # linux distributors often organize the Qt installation # their way and QT_INSTALL_PREFIX doesn't offer a good # path. Also QT_INSTALL_PREFIX is only one of the default # search paths of the designer - not the Qt creator
#QWT_INSTALL_PLUGINS = $$[QT_INSTALL_PREFIX]/plugins/designer
###################################################################### # Features # When building a Qwt application with qmake you might want to load # the compiler/linker flags, that are required to build a Qwt application # from qwt.prf. Therefore all you need to do is to add "CONFIG += qwt" # to your project file and take care, that qwt.prf can be found by qmake. # ( see http://doc.trolltech.com/4.7/qmake-advanced-usage.html#adding-new-configuration-features ) # I recommend not to install the Qwt features together with the # Qt features, because you will have to reinstall the Qwt features, # with every Qt upgrade. ######################################################################
QWT_INSTALL_FEATURES = $${QWT_INSTALL_PREFIX}/features # QWT_INSTALL_FEATURES = $$[QT_INSTALL_PREFIX]/features
###################################################################### # Build the static/shared libraries. # If QwtDll is enabled, a shared library is built, otherwise # it will be a static library. ######################################################################
QWT_CONFIG += QwtDll
###################################################################### # QwtPlot enables all classes, that are needed to use the QwtPlot # widget. ######################################################################
QWT_CONFIG += QwtPlot
###################################################################### # QwtWidgets enables all classes, that are needed to use the all other # widgets (sliders, dials, ...), beside QwtPlot. ######################################################################
QWT_CONFIG += QwtWidgets
###################################################################### # If you want to display svg images on the plot canvas, or # export a plot to a SVG document ######################################################################
QWT_CONFIG += QwtSvg
###################################################################### # If you want to use a OpenGL plot canvas ######################################################################
#QWT_CONFIG += QwtOpenGL
###################################################################### # You can use the MathML renderer of the Qt solutions package to # enable MathML support in Qwt. Because of license implications # the ( modified ) code of the MML Widget solution is included and # linked together with the QwtMathMLTextEngine into an own library. # To use it you will have to add "CONFIG += qwtmathml" # to your qmake project file. ######################################################################
#QWT_CONFIG += QwtMathML
###################################################################### # If you want to build the Qwt designer plugin, # enable the line below. # Otherwise you have to build it from the designer directory. ######################################################################
#QWT_CONFIG += QwtDesigner
###################################################################### # Compile all Qwt classes into the designer plugin instead # of linking it against the shared Qwt library. Has no effect # when QwtDesigner or QwtDll are not both enabled. # # On systems where rpath is supported ( all Unixoids ) the # location of the installed Qwt library is compiled into the plugin, # but on Windows it might be easier to have a self contained # plugin to avoid any hassle with configuring the runtime # environment of the designer/creator.
######################################################################
win32 { QWT_CONFIG += QwtDesignerSelfContained }
###################################################################### # If you want to auto build the examples, enable the line below # Otherwise you have to build them from the examples directory. ######################################################################
#QWT_CONFIG += QwtExamples
###################################################################### # The playground is primarily intended for the Qwt development # to explore and test new features. Nevertheless you might find # ideas or code snippets that help for application development # If you want to auto build the applications in playground, enable # the line below. # Otherwise you have to build them from the playground directory. ###################################################################### #QWT_CONFIG += QwtPlayground ###################################################################### # When Qt has been built as framework qmake wants # to link frameworks instead of regular libs ######################################################################
macx:!static:CONFIG(qt_framework, qt_framework|qt_no_framework) {
QWT_CONFIG += QwtFramework }

デフォルトのコンフィギュレーションから Qwt プロジェクトをコンフィギュレーションする際には、デザイナー プラグインの構築、OpenGL アクセラレーションを使用した構築、およびサンプルの構築が行われないようにし、Qt インストール エリアにインストールされるようにします。

これ以降のビルド プロセスは Qt アプリケーションの場合と同じで、qmake ユーティリティを実行して Qt 固有の makefile を生成し、make を実行した後、make install を実行します。

build> qmake qwt.pro
build> make
build> make install

Qt および Qwt を両方とも構築したら、あらかじめコンパイルされたライブラリとして PetaLinux に統合できます。

PetaLinux との統合

Qt および Qwt が両方ともインストールされたので、PetaLinux プロジェクトと統合し、ライブラリが PetaLinux ルート ファイル システムに含まれるようにします。ターゲット システムで initramfs を使用していない場合は、次の手順は不要になるので、ルート ファイル システムにライブラリを統合するのに必要な手順を実行してください (PetaLinux initramfs を使用していない場合は方法を熟知していると見なされるため、その手順はこのチュートリアルに含まれていません)。

また、PetaLinux プロジェクトの作成およびコンフィギュレーションが完了しているものと想定しており、PetaLinux プロジェクトの構築方法はこのチュートリアルに含まれていません。あらかじめ構築されたライブラリは、この資料の表内のリンクをクリックしてダウンロードできます。このセクションの残りの手順をスキップする場合は、qt-4.8.5.tar.gz をダウンロードし、PetaLinux プロジェクトの /components/libs ディレクトリ (このパスが存在しない場合は作成) に抽出してイネーブルにした後、プロジェクトを構築して、「Qt Creator を使用した設計」セクションに進んでください。

PetaLinux でライブラリを作成するプロセスを実行する場合は、PetaLinux ライブラリ テンプレートを作成することから開始します。

build> cd $PETALINUX_PROJECT_DIR
build> petalinux-create -t libs -n qt-4.8.5 --enable

これで、ディレクトリ構造の components/libs/qt-4.8.5 がプロジェクトに作成されます。また、サンプル ライブラリ テンプレートも作成されますが、使用しないので削除する必要があります。

build> cd components/libs/qt-4.8.5
build> rm libqt*

まず、Qt ライブラリ の lib ディレクトリの内容をコンポーネントのサブディレクトリとしてコピーします。

build> cp -Pr $ZYNQ_QT_INSTALL/lib .

これにより、Qt と Qwt に必要なオブジェクト ファイルおよびシンボリック リンクがコピーされますが、フォントの処理も必要です。「Qt の構築」セクションでも触れたように、$QT_QWS_FONTDIR 環境変数が PetaLinux ターゲットで正しく設定されていることを確認する必要があります。幸い、このメカニズムが PetaLinux によって提供されているため、小さい初期化スクリプトを作成して、initramfs の /etc/profile.d/ に配置します。これは標準の /etc/profile の一部として呼び出され、システムの任意のログイン シェルに適用されます。

profile.qt-4.8.5 というファイルを作成し、次の行を追加します。

QT_QWS_FONTDIR=/usr/lib/fonts
export QT_QWS_FONTDIR

次に、プロジェクトの Makefile を編集して、ライブラリおよびこの新しいプロファイル拡張をターゲット ファイル システムの適切なディレクトリにコピーする必要があります。ライブラリの構築は完了しているため、ビルドおよびクリーン ターゲットは空です。Makefile を次のように編集します (スペース キーではなく Tab キーを使用してインデントを挿入する必要がある)。

ifndef PETALINUX
$(error "Error: PETALINUX environment variable not set.  Change to the root of your PetaLinux install, and source the settings.sh file")
endif
include libs.common.mk
all: build install
.PHONY: build build:
install: # Install libraries and fonts to the rootfs
mkdir -p $(TARGETDIR)/usr/lib rsync -ar ./lib/* $(TARGETDIR)/usr/lib/
# Install the script to ensure the font directory is properly specified mkdir -p $(TARGETDIR)/etc/profile.d cp profile.qt-4.8.5 $(TARGETDIR)/etc/profile.d/profile.qt-4.8.5
clean:

これで、ライブラリが完全に PetaLinux プロジェクトにインストールされました。次の手順へと進む前に、ライブラリをイネーブルにして PetaLinux を構築します。

build> petalinux-config -c rootfs
build> petalinux-build

注記 : Qt は C++ フレームワークであるため、C++ ライブラリが PetaLinux ルート ファイル システムにインストールされている必要があります。これを行うには、PetaLinux プロジェクトの petalinux-config -c rootfs から libstdc++6 ライブラリをイネーブルにします。

Qt Creator を使用した設計

手動で GUI アプリケーションを設計するのは煩雑な作業で、Qt も例外ではありません。これを楽にするため、Qt Project には、完全な C++ IDE、GUI 編集、ソース制御、およびデバッグを組み合わせた Qt Creator という開発用 GUI があります。Qt のフレームワークを利用しているか否かにかかわらず、IDE は、Zynq Linux アプリケーションを容易にクロスコンパイル、構築、およびデプロイできるように設計されています。このアンサーの最後のセクションでは、Zynq をターゲットとする Qt プロジェクトで使用するため IDE をコンフィギュレーションする方法について説明します。

まず、Qt Creator ツールをダウンロードしてインストールする必要があります。方法は簡単で、アーカイブを抽出して /bin ディレクトリからツールを実行するだけなので、詳細な手順はこのチュートリアルでは説明されていません。

IDE を起動したら、 [Tools] → [Options] をクリックし、左側にあるアイテムから [Build & Run] を選択します。[Kits] タブを選択し、[Add] をクリックします。 「PetaLinux」という新しいターゲットを作成し、次の図に示すようにコンフィギュレーションします。


タブの多くでは、デフォルトの値が定義されていません。[Device] の右側にある [Manage] クリックし、Zynq ボードをコンフィギュレーションします。このタブで Zynq デバイスの設定を指定します。SSH 経由で接続できない場合は、Dropbear が PetaLinux アプリケーションにインストールされていること、および Zynq ボードの IP アドレスが有効であることを確認します。GDB サーバー実行ファイルには gdbserver を使用します。


コンパイラに対しても [Manage] をクリックし、Xilinx Zynq クロスコンパイラをコンフィギュレーションします。[Add] をクリックして新しいツールチェーンを追加し、gcc 実行ファイルをポイントするようにします。


Qt バージョンに対しても同様に、Qt インストール ディレクトリ ($WORK_DIR/Qt/install/bin) の qmake 実行ファイルをポイントするようにします。

これで、作成した Zynq キットに対して新しいプロジェクトを作成できるようになりました。あとは、Zynq ターゲットで使用するようにプロジェクトをコンフィギュレーションするだけです。これを行うには、2 つの手順を踏む必要があります。まず最初に、エンベデッド Linux ターゲットのダウンロード ディレクトリに関する情報を含めるために、プロジェクト用の qmake.pro ファイルをコンフィギュレーションします。次の行を追加して qmake.pro ファイルを編集します。

linux-* {
        target.path = /home/root
                INSTALLS += target
}

最後に Qt Creator で、[Project] → [Run] のオプションを次のようにコンフィギュレーションします。空きディスク容量のチェックを削除し、-qws 行がコマンド ライン引数としてファイルに追加されていることを確認したら、すべて完了です。これで、Qt Creator を使用して Linux デスクトップから PetaLinux 用の Qt アプリケーションを構築およびデバッグすることが可能になりました。


添付ファイル

関連添付ファイル

タイトル サイズ ファイルタイプ
qt-4.8.5.tar.gz 14 MB GZ
AR# 59172
日付 07/07/2014
ステータス アクティブ
種類 一般
デバイス 詳細 概略
ツール