2009-10-18

【備忘録】GCC のランタイムライブラリの扱い

Qt や wxWidgets を利用したクロスコンパイルしたバイナリは、mingwm10.dll や GCC のランタイムライブラリ libgcc_s_sjlj-1.dll に依存しています。この2つのファイルについては、ランタイムライブラリのインストーラとして別に作成しておいた方が、Qt や wxWidgets など C++ 系のランタイムライブラリのインストーラを用意する際に運用がしやすいのですが、配布する際のライセンスをどうすればいいのか、いまひとつはっきりしませんでした。

Windows 上で実行する場合、mingwm10.dll は問題がないとしても、GCC のライセンスは GPL に従っているから、libgcc_s_sjlj-1.dll の扱いをどうするか悩みます。

調べてみると、GCC のランタイムライブラリについては、ちゃんと例外条項がありました。これですっきりしました。BSD 系 UNIX が gcc を利用していても BSD ライセンスに従うことができるのは、もしかしてこの例外条項のおかげなのかな?まだまだ勉強不足です。

とにかく、近日中に Windows 用ランタイムライブラリのインストーラをいくつかか追加しようと考えています。

[1] GCC Runtime Library Exception - GNU Project - Free Software Foundation (FSF)
[2] ライセンス(ライトニングトークつづき) - bero の日記
 

2009-10-14

Qt でクロスコンパイル

Get MinGW Cross Compiler at SourceForge.net. Fast, secure and Free Open Source software downloads
MinGW のクロスコンパイル用パッケージ、mingw32-qt のインポートライブラリ libQt4* に、libQT* で始まる名前のシンボリックリンクを加えたところ、Hello World! のプログラムをクロスコンパイルすることができました。編集を加えた RPM パッケージを以下にアップロードしました。

- mingw32-qt-4.5.2-1.1

前回のサンプルをクロスコンパイルしたバイナリを wine 上で実行してみたところ、qmake-qt4make でコンパイルができたものの。日本語フォントの表示ができなかったので、プログラム hello_qt.cpp を若干変更しました。

#include <QApplication>
#include <QPushButton>
#include <QTextCodec>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));

QPushButton hello("こんにちは、世界!");
hello.setWindowTitle("Hello World!");

hello.show();
return app.exec();
}

コンパイルは、前回の Fedora ネイティブ用のコンパイルと同様、qt-devel に収録されている /usr/bin/qmake-qt4 を利用しますが、クロスコンパイルで利用するためには、mingw32-qt-qmake もインストールしておく必要があります。その上で QMAKESPEC 環境変数をクロスコンパイル用の情報を参照するように設定します。
make すると、バイナリはサブディレクトリ release に出力されます。

[bitwalk@localhost qt_hello]$ export QMAKESPEC=fedora-win32-cross
[bitwalk@localhost qt_hello]$ qmake-qt4 -project
[bitwalk@localhost qt_hello]$ qmake-qt4
[bitwalk@localhost qt_hello]$ make
make -f Makefile.Release
make[1]: ディレクトリ `/home/bitwalk/work/qt_hello' に入ります
i686-pc-mingw32-g++ -c -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 --param=ssp-bu
ffer-size=4 -mms-bitfields -O2 -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_DE
BUG -DQT_GUI_LIB -DQT_CORE_LIB -I"/usr/i686-pc-mingw32/sys-root/mingw/include/Qt
Core" -I"/usr/i686-pc-mingw32/sys-root/mingw/include/QtGui" -I"/usr/i686-pc-ming
w32/sys-root/mingw/include" -I"." -I"release" -I"/usr/lib64/qt4/mkspecs/fedora-w
in32-cross" -o release/hello_qt.o hello_qt.cpp
i686-pc-mingw32-g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-ru
ntime-pseudo-reloc -Wl,-s -o release/qt_hello.exe release/hello_qt.o -L"/usr/i6
86-pc-mingw32/sys-root/mingw/lib" -lQtGui -lQtCore
make[1]: ディレクトリ `/home/bitwalk/work/qt_hello' から出ます
[bitwalk@localhost qt_hello]$ ./release/qt_hello &
[2] 2680
[bitwalk@localhost qt_hello]$ err:wintab32:X11DRV_LoadTabletInfo Unable to initi
alize the XInput library.
fixme:win:FlashWindowEx 0x61dd98


wine で実行すると、日本語フォントはきれいではありませんが、とにかく表示されています。

実行に必要な DLL と一緒に Windows へコピーして実行してみます。



コマンドプロンプトのコンソールも表示されてしまいますが、実行できます。また、フォントは wine で実行した時に比べるとずっとまともです。

より詳細な情報は、後日 MinGW クロスコンパイル - Workshop Complex at bitWalk にまとめる予定です。

参考サイト
[1] VikiWiki - Qt
[2] qmake のコンセプト