ホームページmini2440>その3a・MacでのQtクロス開発できた

その3a・MacでのQtクロス開発できた

目次
 はじめに

 その後、Qtのビルドに再トライしてみましたが、成功しました(と思う)のでまとめておきます。
 なお、本作業は実機のDebian 7.0 wheezy化後に行いましたが、Qtのビルドはmac上で完結することなので、Debian化がビルドに直接影響することはない筈です。

 検証マシンはMac mini mid 2010、OSは10.11.1&2、Qtは4.8.6、Qt Creatorは3.2.1です。
 また、各バージョンは試行時のもので、最新版とは異なる場合があります。


 Qtその後

 再度Advanced Sysrootを使って、Qtのビルドにトライしてみました。再トライの方針は以下の通りとしました。
  1. エラーの直接原因がX11だったので、まずはX11のビルドを通す
  2. 他に必要なライブラリがあれば、事前に用意しておく
 X11がビルドできない原因は、includeファイルが見つからない、というものでした。
 includeファイル自体は「<Advanced Sysrootのホーム>/sysroot/include」にあって、そこへのパス(らしき)設定もビルド用のformula(libX11.sh)にあるのですが、コンパイラには伝わっていないような感じです。
 当初はパスのオーバーライドを考えていたのですが、結局諦め、「一度アーカイブを解凍し、<Advanced Sysrootのホーム>/sysroot/include/X11の中身を、解凍したX11フォルダのinclude/X11に全コピーし、再度tarしてbzip」という、思いっきり強引な方法を採りました。(まぁ、あくまでホビー用途なので。なおこの場合、sha1も指定し直す必要がありますが、「openssl sha1 <アーカイブファイル>」で取得できます。)
 これで実行したところ、ビルドは完了しました。

 次に、必要なライブラリですが、qt-everywhere4.shに記述されているのは以下のようなものでした。
dbus glib gstreamer jpeg libffi liblzma libX11 libXau libXext libXv libxcb libxml2 orc pthread-stubs tslib xcb-proto xcb-util xcb-util-image xcb-util-keysyms xcb-util-wm
 ただし、上記ライブラリがさらに別のライブラリを呼んでいることもあるので、Advanced Sysroot全体を最初からやり直すこととし、止まったらそのライブラリを削除して再実行、という方法で、ともかくも最後まで終えました。
 この時、上記関連ライブラリの中では、glibがオリジナルの2.40でエラーが出たので2.46を使い、gstreamerがエラーでビルドできませんでした。

 gstreamerについてはすぐに対処できそうになかったので、ひとまずこれを無視してQtをビルドしてみたところ、途中で止まることなく完了しました。
 早速、テストアプリを実行してみましたが、ライブラリのエラーは出なくなった(Debian 7.0化の効果か?)ものの、以下の通り出力されました。
bash: line 1:  2752 Illegal instruction     DISPLAY=':0.0' /root/test1
 どうも、バイナリがARMv4T向けにできていない印象ですが、これがアプリ本体なのかQtなのかライブラリなのかはまだ不明です。
(可能性のありそうなところには「-march=armv4t」を指定しているつもりですが、まだ漏れがあるかもしれません。)

 とはいえ、実験のためのベース環境はできた、と見て良さそうです。


 Qtその後のその後(成功)

 前項での「Illegal instruction」の原因を特定するべく、実機にgdbをインストールして実行してみました。
ツールチェーンのgdbはPythonに非対応のようで、Qtからデバッガを起動しようとするとエラーになる。そのため、実機にgcc関連一式をインストール後、gdbを起動している。(Qtで実機のgdbを指定できるのかは不明。)
Program received signal SIGILL, Illegal instruction.
0x40b4c590 in ?? () from /usr/local/Qt4.8.6-arm/lib/libQtCore.so.4
 エラーを出していたのは、Qtのライブラリでした。

 このケースでも、前項のX11の時と同じく、ビルド用のformula(qt-everywhere4.sh)で指定したパラメータがコンパイラに伝わっていないような感じです。
 そこで、パラメータをダイレクトに指定できるよう、Advanced Sysrootを使わず、単体でビルドしてみることにしました。
  1. 既にダウンロード済のqt-everywhere-opensource-src-4.8.6.tar.gzを解凍し、Advanced Sysrootとは独立したディレクトリに置く。
  2. <Advanced Sysrootのホーム>/arm-cross-sysroot/patches/qt-mac_os_x.patchの内容を適用(念のため)。
  3. <今回ビルドのホーム>/qt-everywhere-opensource-src-4.8.6/mkspecs/qws/linux-arm-gnueabi-g++/qmake.confを、以下の通り編集。
    …
    # modifications to g++.conf
    QMAKE_CC                = /usr/local/carlson-minot/crosscompilers/bin/arm-none-linux-gnueabi-gcc -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t -O0
    QMAKE_CXX               = /usr/local/carlson-minot/crosscompilers/bin/arm-none-linux-gnueabi-g++ -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t -O0
    QMAKE_LINK              = /usr/local/carlson-minot/crosscompilers/bin/arm-none-linux-gnueabi-g++ -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t -O0
    QMAKE_LINK_SHLIB        = /usr/local/carlson-minot/crosscompilers/bin/arm-none-linux-gnueabi-g++ -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t -O0
    
    # modifications to linux.conf
    QMAKE_AR                = /usr/local/carlson-minot/crosscompilers/bin/arm-none-linux-gnueabi-ar cqs
    QMAKE_OBJCOPY           = /usr/local/carlson-minot/crosscompilers/bin/arm-none-linux-gnueabi-objcopy
    QMAKE_STRIP             = /usr/local/carlson-minot/crosscompilers/bin/arm-none-linux-gnueabi-strip
    …
    
     参考サイト(1):Illegal Instruction on Mini2440 With Qt 4.7.4
  4. configureコマンドは以下の通り。(基本的にqt-everywhere4.shそのままだが、エラーになるオプションは外した。)
    ./configure -prefix /usr/local/Qt4.8.6-arm -opensource -confirm-license -embedded arm -xplatform qws/linux-arm-gnueabi-g++ -depths 16,24,32 -fast -little-endian -host-little-endian -no-3dnow -no-cups -no-largefile -no-mmx -no-phonon-backend -no-qt3support -no-sql-ibase -no-sql-psql -no-sql-mysql -no-sql-odbc -no-sse -no-sse2 -no-ssse3 -no-webkit -nomake examples -nomake demos -nomake docs-nomake
    
  5. X11を始めとするライブラリ類の指定については、明示的には何もしない。(エラーが出たらその時点で対処。)
 以上の条件でconfigure/make/make installしたところ、途中で止まることなく完了しました。
 libとpluginsを実機にコピー後、テストアプリを実行してみたところ、Illegal instructionは出ず、代わりに以下のメッセージが出ました。
…
QWSSocket::connectToLocalFile could not connect:: No such file or directory
No Qt for Embedded Linux server appears to be running.
If you want to run this program as a server,
add the "-qws" command-line option.
 なので指示通り、実行の引数に-qwsを追加したところ、実機のディスプレイにテストアプリのウィンドウが表示されました。
 やはり、パラメータが伝わっていなかったようです。

 X11を始めとするライブラリ類を指定していないのに動作している件は、不要なのか、Advanced Sysrootで設定した環境変数等がそのまま生きていて参照ができているのか、あるいはMac側(/usr/X11、/usr/X11R6、/opt/X11)のが使われているのか、よく分かりません。(試行錯誤でいろいろ突っ込むと、得てしてこういう事態に。というか、Advanced Sysrootの解明を先にしろよ、ってことか。)
 今後もし、一からやり直す機会があれば、まずQt単体をインストールし、ライブラリ関連のエラーが出たらAdvanced Sysrootを実行してみる、とかしてみたいと思います。
追記:以下のサイトによると、Linux向けQtのうち、DesktopはX11ベース、Embeddedは独自実装、ということのようです。(ただし、最近のEmbedded機器はかなりリッチになってきているため、線引きは結構曖昧になっているようではありますが。)
なので、今回のケースではX11は未使用とみて良さそうです。(2016.01.14)
参考サイト(2):UNIX USER1月号「デスクトップで動かす・学ぶQt/Embedded」より転載:Qtとは――第1回 フレームバッファでQtアプリ(その1) (1/3) - ITmedia エンタープライズ
 なお、テストアプリはウィンドウを表示するだけの簡単なものなので、より高度なアプリでは問題が出るかもしれませんし、インプットデバイス対応も必要になります。
 が、ともかくも動作テストの行える環境は手に入りました。


 おわりに

 MacでのQtクロス開発は可能であることが確認できました。

 ただし、今回の作業は実機のDebian化後に行ったものであるため、厳密には「Debian化はMacでは行えず、Ubuntu&Windows XPマシンを使った」ことから、Macで全て出来たということを意味しません。
 とはいえ、(実際に確認した訳ではありませんが、)オリジナルのQtopiaベースでも、若干のアレンジでQtアプリを動かせると考えられるため、オリジンルのままでよければMac上で完結することも可能ではないか、と予想できます。

 そういう意味では、できた、と言ってもいいのかもしれません。


 お世話になったサイト

 有用なソフトウェアおよび貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)

 参考サイト(1):Illegal Instruction on Mini2440 With Qt 4.7.4
 参考サイト(2):UNIX USER1月号「デスクトップで動かす・学ぶQt/Embedded」より転載:Qtとは――第1回 フレームバッファでQtアプリ(その1) (1/3) - ITmedia エンタープライズ


 更新履歴

 2016.02.10 「その3・MacでのQtクロス開発はできるかも??」から独立
 2015.11.18 新規作成


[Home]  [MacSoft]  [Donation]  [History]