Hello World
このページでは、FLTKを利用した小さなプログラムを作成します。 C++コードの内容を理解することよりも、ビルド(コンパイルとリンク)のやり方を理解することに重点を置きます。 まずはコマンドラインから手動でGCCのコマンドを実行する方法を紹介します。 この方法さえを理解してしまえば、Makefileを書くにもIDEの設定を行うにもに苦労せずにすむかと思います。
前提
FLTKのインストールに従って、FLTK 1.4.3が $HOME/MikanBox 以下にインストールされているものとします。 違う場所にインストールした場合は1)、パスをご自身のものに置き換えてください。
作業ディレクトリの用意
作業ディレクトリは $HOME/code/fltk/hello-fltk とします。 ここに作成するプログラムのソースコードを保存して、また、ここでビルドを行います。
まずディレクトリを作成して、そこに移動しておきます。
$ mkdir -p ~/code/fltk/hello-fltk $ cd $_
プログラムのソースコード
今回作成するプログラムのソースコードは、FLTKのマニュアルにあるものをそのまま拝借します。
main.cpp:
/********************************************/
/* https://www.fltk.org/doc-1.4/basics.html */
/********************************************/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
int main(int argc, char **argv) {
Fl_Window *window = new Fl_Window(340, 180);
Fl_Box *box = new Fl_Box(20, 40, 300, 100, "Hello, World!");
box->box(FL_UP_BOX);
box->labelfont(FL_BOLD + FL_ITALIC);
box->labelsize(36);
box->labeltype(FL_SHADOW_LABEL);
window->end();
window->show(argc, argv);
return Fl::run();
}
かなり直感的なものであるとは思います。 もしそうでなくて意味不明だったとしても、問題ありません。 このコードを素材に、FLTKアプリケーションのビルド手順を体験するのが今回の目的です。 コードの意味については今後よく吟味します。2)
コンパイル
コンパイルとリンクを一度に行うこともできますが、今回は別々に分けて行います。 そのほうが説明しやすいからです。
FLTKには、fltk-configというツール3)が付属しています。 pkg-configによく似た使い方をします。 $HOME/MikanBoxにFLTKをインストールしたので、この下のbinディレクトにfltk-configが存在しています。
$ ~/MikanBox/bin/fltk-config --version 1.4.3
このツールは、指定されたオプションにしたがって、コンパイラ・リンカに渡すフラグをテキストとして出力します。 指定可能なオプションの一覧はこちら。
C++コンパイラに指定するコンパイルフラグを出力するためのオプションは「--cxxflags」です。
$ ~/MikanBox/bin/fltk-config --cxxflags -I/home/freemikan/MikanBox/include -I/home/freemikan/MikanBox/include/FL/images -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_THREAD_SAFE -D_REENTRANT
パスのプリフィクスが/home/freemikan/MikanBoxとなっていることに注目してください。 これはインストール時にCMAKE_INSTALL_PREFIXでそう指定したからこのようになっています。
C++コンパイラとしてGCCを利用するので、この出力をそのままg++コマンドに渡してやります。
コピペするより、シェルのコマンド置き換えを利用したほうがずっと良いです。
コマンド置き換えは $(command …)
とするか `command …`
4) とします。
具体的には次のようにしてコンパイルします。
$ g++ -c main.cpp `~/MikanBox/bin/fltk-config --cxxflags`
「-c」は手動で与えている点に注意してください。 これによって、リンクは行わず、コンパイルのみを行うこと指示しています。
結果の確認
コンパイラのオプションに間違いがなく、コンパイルエラーもなければ、何もメッセージは出力されずにコマンドが完了します。 コンパイルされたオブジェクトファイルが生成されているはずなので、それを確認してみましょう。
$ ls -l 合計 12 -rw-r--r-- 1 freemikan freemikan 400 5月 23 01:01 main.cpp -rw-rw-r-- 1 freemikan freemikan 7816 5月 23 01:01 main.o ←生成されたオブジェクトファイル
main.oが存在していればOKです。
リンク
リンカオプションも同様にfltk-configの助けを借ります。 リンカオプションを出力するfltk-configのオプションは「--ldflags」です。
$ ~/MikanBox/bin/fltk-config --ldflags -L/home/freemikan/MikanBox/lib -lfltk -lm -lX11 -lXext -lpthread -ldl
これをコマンド置き換えでg++に渡してやります。
$ g++ -o hello-fltk main.o `~/MikanBox/bin/fltk-config --ldflags`
「-o hello-fltk」は、生成する実行可能バイナリファイル名前をhello-fltkとすることを指示しています。 続けて、入力ファイルであるmain.oを指定しています。
$ g++ -o hello-fltk `~/MikanBox/bin/fltk-config --ldflags` main.o
これはリンクエラーになります。
結果の確認
リンクに問題がなければ、何もメッセージは出力されずにコマンドが終了します。 実行可能バイナリファイルが生成されていることを確認しておきましょう。
$ ls -l 合計 1644 -rwxrwxr-x 1 freemikan freemikan 1670960 5月 23 01:02 hello-fltk ←生成された実行可能バイナリファイル -rw-r--r-- 1 freemikan freemikan 400 5月 23 01:01 main.cpp -rw-rw-r-- 1 freemikan freemikan 7816 5月 23 01:01 main.o
hello-fltkが存在していればOKです。
Hello Worldプログラムの実行
最後に、hello-fltkを実行して、問題なくFLTKのウィンドウが表示されることを確認しておきます。
$ ./hello-fltk
このようなルック・アンド・フィールは典型的なFLTKアプリケーションのスタイルです。 あくまで個人的にですが、ややレトロチックで2000年代初頭のような印象を受けます。 逆にそれが良いと思われれば幸いです。