Windows:FLTK2:DLLビルド

Windows:FLTK2:DLLビルド


FLTK2 とは

細かい紹介は置いといて、UTF 対応・動作が軽い・ソースがシンプルな点が気 に入った GUI ツールキットです。C++ で書かれています。 本家サイト は英語ですが、スクリーンショットもあ るので雰囲気は分かるんじゃないかと思います。

ダウンロード

せっかくなので新しい 2.0 系列をダウンロードしました。 2.0 の現時点の最新バージョンは 2.0.x-r7513 のようです。

お試しビルド(MinGW)

README 読むと cygwin 相当の MinGW ライブラリがインストールされていれば cygwin に依存しないバイナリがビルドできるっぽい事書いてましたのでとり あえず

 $ ./configure
 $ make

だけしてみました。make install はどういう風にインストールされるかまだ分か ってないのでパス。余談ですがファイル構成が unix っぽくない感じがします。 でもこっちの方が見通しが良いような。

ちょっと話がそれました。で、 test フォルダ以下にサンプルっぽい exe が 入ってるので起動させてみます。GTK と比較すると確かに起動が早いです。

あと test フォルダ以下のプログラムにあるうち何でもいいですが 1 つを dependency walker などで確認してもどうやら cygwin の dll はないようで す。(そもそも自分は cygwin 環境入れてないのでわざわざ見る必要もないの かもしれませんが一応)

DLL としてビルド(MinGW)

configure オプションの追加

FLTK は ./configure に何もオプションを渡さないとデフォルトではスタティ ックライブラリしか生成しません。プログラムへの組込みを想定している為で すかね。

DLL も生成したい場合は configure スクリプトに --enable-shared オプショ ンを渡します。

 $ ./configure --prefix=/c/MinGW/ --enable-shared

Makefile 修正① fltk2_glut.dll をビルド・インストールしないようにする

ビルドできない理由は良く分かってませんが、MinGW だと fltk2_glut.dll を 作る為にリンクしてるトコでコケてしまいます。glut/README 読むともうあん まサポートする気ないみたいな事書いてるみたいですし GLUT を使う事はとり あえず考えてませんので DLL を作らないようglut/Makefile を以下のように 修正しました。

#
# Make static libraries...
#

#../lib/$(LIBNAME): $(OBJECTS)
#       $(RM) $@
#       echo $(LIBCOMMAND) $@ ...
#       $(LIBCOMMAND) $@ $(OBJECTS)
#       $(RANLIB) $@
#
../lib/$(DSONAME): $(OBJECTS)
#       echo $(DSOCOMMAND) $@ ...
#       $(DSOCOMMAND) $@ $(OBJECTS)
#       $(RM) ../lib/$(DSOLINK)
#       $(LN) $(DSONAME) ../lib/$(DSOLINK)

#../lib/fltk2_glut.dll: $(OBJECTS)
#       echo $(DSOCOMMAND) $@ ...
#       $(DSOCOMMAND) $@ $(OBJECTS) $(IMAGELIBS) $(LOCAL_IMAGELIBS) $(LINKFLTK) $(GLDLIBS)
#       cp ../lib/fltk2_glut.dll ./

shared を作るターゲットラベルだけ残す形にしてます。 また、make install 時も fltk2_glut.dll をインストールしようとする箇所 がありますのであらかじめコメントアウトしておきます。

install:
#        ifneq (,$(wildcard ../lib/$(LIBNAME)))
#       echo "Installing static glut library in $(libdir)"
#       $(MKDIR) $(DESTDIR)$(libdir)
#       $(RM) $(DESTDIR)$(libdir)/$(LIBNAME)
#       $(CP) ../lib/$(LIBNAME) $(DESTDIR)$(libdir)
#        endif
#        ifneq (,$(wildcard ../lib/$(DSONAME)))
#       echo "Installing shared glut library in $(libdir)"
#       $(MKDIR) $(DESTDIR)$(libdir)
#       $(RM) $(DESTDIR)$(libdir)/$(DSONAME)
#       $(RM) $(DESTDIR)$(libdir)/$(DSOLINK)
#       $(CP) ../lib/$(DSONAME) $(DESTDIR)$(libdir)
#       $(LN) -s $(DSONAME) $(DESTDIR)$(libdir)/$(DSOLINK)
#        endif
#        ifeq ($(DSONAME), fltk2_glut.dll)
#       $(CP) lib$(DSONAME).a $(DESTDIR)$(libdir)
#        endif

Makefile 修正② シンボリックリンクを作らないようにする

Cygwin では分かりませんが、少なくとも MSYS ではシンボリックリンクはま ともに扱えないみたいですので、src/Makefile の以下の部分をコメントアウ トしてしまいます(287 行目)

 #      $(LN) $(DSONAME) $(DESTDIR)$(libdir)/$(DSOLINK)

gauche バインディング用の修正

Gauche:FLTK2バインディング:callbackの実装 の真ん中の項目を見て修正します。リンク先のページでも記述してますが、 fltk::Widget::do_callback() に virtual をつけただけです。

ビルド・インストール

 $ make
 $ make install

make が途中でエラーになるかもしれませんが、実際に必要になると思われる 下記 3 ファイルは生成されるはずです。

fltk2-config の修正

次のテストコードをビルドする時に使用しますが ldflag に何故か suffix を 付加してしまい、このままではビルド時のリンクに失敗します。fltk2-config の中身はシェルスクリプトなので以下の部分を修正します。(266 行目辺り)

# Calculate needed libraries
LDSTATIC="$libdir/libfltk2.a $LDLIBS"
#LDLIBS="$libs -lfltk2$SHAREDSUFFIX $LDLIBS"
LDLIBS="$libs -lfltk2 $LDLIBS"
LIBS="$LIBS $libdir/libfltk2.a"

テストコード実行

FLTK2 Document にある example1 コードをビルドしてみます。

// hello.cxx (example1)

#include <fltk/Window.h>
#include <fltk/Widget.h>
#include <fltk/run.h>
using namespace fltk;

int main(int argc, char **argv) {
  Window *window = new Window(300, 180);
  window->begin();
  Widget *box = new Widget(20, 40, 260, 100, "こんにちわ世界");
  box->box(UP_BOX);
  box->labelfont(HELVETICA_BOLD_ITALIC);
  box->labelsize(36);
  box->labeltype(SHADOW_LABEL);
  window->end();
  window->show(argc, argv);
  return run();
}

名前はまぁ native-hello.cxx とかにしときましょうか。

 > gcc -o native-hello.exe native-hello.cxx `fltk2-config --ldflags`

これでコンパイルできるかと思います。 日本語もちゃんと表示されます。


Last modified : 2010/06/03 00:34:48 JST