ホームページ>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のビルドにトライしてみました。再トライの方針は以下の通りとしました。
X11がビルドできない原因は、includeファイルが見つからない、というものでした。
- エラーの直接原因がX11だったので、まずはX11のビルドを通す
- 他に必要なライブラリがあれば、事前に用意しておく
includeファイル自体は「<Advanced Sysrootのホーム>/sysroot/include」にあって、そこへのパス(らしき)設定もビルド用のformula(libX11.sh)にあるのですが、コンパイラには伝わっていないような感じです。
当初はパスのオーバーライドを考えていたのですが、結局諦め、「一度アーカイブを解凍し、<Advanced Sysrootのホーム>/sysroot/include/X11の中身を、解凍したX11フォルダのinclude/X11に全コピーし、再度tarしてbzip」という、思いっきり強引な方法を採りました。(まぁ、あくまでホビー用途なので。なおこの場合、sha1も指定し直す必要がありますが、「openssl sha1 <アーカイブファイル>」で取得できます。)
これで実行したところ、ビルドは完了しました。
次に、必要なライブラリですが、qt-everywhere4.shに記述されているのは以下のようなものでした。
ただし、上記ライブラリがさらに別のライブラリを呼んでいることもあるので、Advanced Sysroot全体を最初からやり直すこととし、止まったらそのライブラリを削除して再実行、という方法で、ともかくも最後まで終えました。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
この時、上記関連ライブラリの中では、glibがオリジナルの2.40でエラーが出たので2.46を使い、gstreamerがエラーでビルドできませんでした。
gstreamerについてはすぐに対処できそうになかったので、ひとまずこれを無視してQtをビルドしてみたところ、途中で止まることなく完了しました。
早速、テストアプリを実行してみましたが、ライブラリのエラーは出なくなった(Debian 7.0化の効果か?)ものの、以下の通り出力されました。
どうも、バイナリがARMv4T向けにできていない印象ですが、これがアプリ本体なのかQtなのかライブラリなのかはまだ不明です。bash: line 1: 2752 Illegal instruction DISPLAY=':0.0' /root/test1
(可能性のありそうなところには「-march=armv4t」を指定しているつもりですが、まだ漏れがあるかもしれません。)
とはいえ、実験のためのベース環境はできた、と見て良さそうです。
Qtその後のその後(成功)
前項での「Illegal instruction」の原因を特定するべく、実機にgdbをインストールして実行してみました。
ツールチェーンのgdbはPythonに非対応のようで、Qtからデバッガを起動しようとするとエラーになる。そのため、実機にgcc関連一式をインストール後、gdbを起動している。(Qtで実機のgdbを指定できるのかは不明。)
エラーを出していたのは、Qtのライブラリでした。Program received signal SIGILL, Illegal instruction. 0x40b4c590 in ?? () from /usr/local/Qt4.8.6-arm/lib/libQtCore.so.4
このケースでも、前項のX11の時と同じく、ビルド用のformula(qt-everywhere4.sh)で指定したパラメータがコンパイラに伝わっていないような感じです。
そこで、パラメータをダイレクトに指定できるよう、Advanced Sysrootを使わず、単体でビルドしてみることにしました。
以上の条件でconfigure/make/make installしたところ、途中で止まることなく完了しました。
- 既にダウンロード済のqt-everywhere-opensource-src-4.8.6.tar.gzを解凍し、Advanced Sysrootとは独立したディレクトリに置く。
- <Advanced Sysrootのホーム>/arm-cross-sysroot/patches/qt-mac_os_x.patchの内容を適用(念のため)。
- <今回ビルドのホーム>/qt-everywhere-opensource-src-4.8.6/mkspecs/qws/linux-arm-gnueabi-g++/qmake.confを、以下の通り編集。
参考サイト(1):Illegal Instruction on Mini2440 With Qt 4.7.4… # 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 …
- 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
- X11を始めとするライブラリ類の指定については、明示的には何もしない。(エラーが出たらその時点で対処。)
libとpluginsを実機にコピー後、テストアプリを実行してみたところ、Illegal instructionは出ず、代わりに以下のメッセージが出ました。
なので指示通り、実行の引数に-qwsを追加したところ、実機のディスプレイにテストアプリのウィンドウが表示されました。… 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.
やはり、パラメータが伝わっていなかったようです。
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]