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を指定しています。

入力ファイル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

Hello FLTK!

このようなルック・アンド・フィールは典型的なFLTKアプリケーションのスタイルです。 あくまで個人的にですが、ややレトロチックで2000年代初頭のような印象を受けます。 逆にそれが良いと思われれば幸いです。

1)
違う場所であっても全く問題ありません。
2)
さしあたってnewによって作成したオブジェクトをdeleteしていないことに疑念を抱かれかるもしれませんが、これが現実で問題になることはありません。FLTKはそのように作られています。
3)
シェルスクリプトで書かれたユーティリティです。
4)
「`」はバッククォートです
文書の編集
文書の先頭へ