差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
fltk:helloworld [2025/05/30 13:52] – [ボタン] Set a link to fltk: page for FLTK logo freemikan | fltk:helloworld [2025/06/09 20:19] (現在) – Escape double dash "--" with %% freemikan | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== | + | ====== |
[[fltk: | [[fltk: | ||
+ | このページでは、FLTKを利用した小さなプログラムを作成します。 | ||
+ | C++コードの内容を理解することよりも、ビルド(コンパイルとリンク)のやり方を理解することに重点を置きます。 | ||
+ | まずはコマンドラインから手動でGCCのコマンドを実行する方法を紹介します。 | ||
+ | この方法さえを理解してしまえば、Makefileを書くにもIDEの設定を行うにもに苦労せずにすむかと思います。 | ||
+ | ===== 前提 ===== | ||
+ | [[install|FLTKのインストール]]に従って、FLTK 1.4.3が $HOME/ | ||
+ | 違う場所にインストールした場合は((違う場所であっても全く問題ありません。))、パスをご自身のものに置き換えてください。 | ||
- | ===== Fl_Buttonクラス ===== | ||
- | Fl_Buttonクラスから派生するクラス全体の階層図 | + | ===== 作業ディレクトリの用意 ===== |
+ | 作業ディレクトリは $HOME/ | ||
+ | ここに作成するプログラムのソースコードを保存して、また、ここでビルドを行います。 | ||
- | {{ https:// | + | < |
+ | こういった名前やパスは、何かしら決めておかないと説明がしづらいので提示しているだけです。 | ||
+ | 同じ名前にする必要は全くありません。 | ||
+ | ご自身の好みの場所に好きな名前で作成してください。 | ||
+ | </ | ||
- | {{ : | + | まずディレクトリを作成して、そこに移動しておきます。 |
- | <code cpp> | + | <cli> |
- | #include <FL/Fl.H> | + | $ mkdir -p ~/code/ |
- | #include < | + | $ cd $_ |
- | # | + | </cli> |
- | int main(int argc, char **argv) { | ||
- | auto window = new Fl_Window(400, | ||
- | auto button1 = new Fl_Button(100, | ||
- | auto button2 = new Fl_Button(100, | ||
- | auto button3 = new Fl_Button(100, | ||
- | window-> | ||
- | window-> | ||
- | return Fl::run(); | ||
- | } | ||
- | </ | ||
+ | ===== プログラムのソースコード ===== | ||
+ | 今回作成するプログラムのソースコードは、FLTKのマニュアルにあるものをそのまま拝借します。 | ||
- | ==== Fl_Radio_Buttonクラス ==== | + | * https:// |
- | {{ :fltk: | + | __main.cpp__: |
<code cpp> | <code cpp> | ||
- | #include <FL/Fl.H> | + | /********************************************/ |
- | #include <FL/Fl_Radio_Button.H> | + | /* https://www.fltk.org/doc-1.4/ |
- | #include <FL/Fl_Window.H> | + | / |
- | int main(int argc, char **argv) { | ||
- | auto window = new Fl_Window(400, | ||
- | auto button1 = new Fl_Radio_Button(100, | ||
- | auto button2 = new Fl_Radio_Button(100, | ||
- | auto button3 = new Fl_Radio_Button(100, | ||
- | window-> | ||
- | window-> | ||
- | return Fl::run(); | ||
- | } | ||
- | </ | ||
- | |||
- | |||
- | ==== Fl_Repeat_Buttonクラス ==== | ||
- | |||
- | {{ : | ||
- | |||
- | <code cpp> | ||
#include < | #include < | ||
- | #include < | ||
#include < | #include < | ||
+ | #include < | ||
int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
+ | box-> | ||
+ | box-> | ||
window-> | window-> | ||
window-> | window-> | ||
行 69: | 行 58: | ||
</ | </ | ||
+ | かなり直感的なものであるとは思います。 | ||
+ | もしそうでなくて意味不明だったとしても、問題ありません。 | ||
+ | このコードを素材に、FLTKアプリケーションのビルド手順を体験するのが今回の目的です。 | ||
+ | コードの意味については今後よく吟味します。((さしあたってnewによって作成したオブジェクトをdeleteしていないことに疑念を抱かれかるもしれませんが、これが現実で問題になることはありません。FLTKはそのように作られています。)) | ||
- | ==== Fl_Return_Buttonクラス | + | ===== コンパイル |
+ | コンパイルとリンクを一度に行うこともできますが、今回は別々に分けて行います。 | ||
+ | そのほうが説明しやすいからです。 | ||
- | {{ :fltk: | + | FLTKには、fltk-configというツール((シェルスクリプトで書かれたユーティリティです。))が付属しています。 |
+ | pkg-configによく似た使い方をします。 | ||
+ | $HOME/ | ||
- | <code cpp> | + | <cli> |
- | #include <FL/Fl.H> | + | $ ~/MikanBox/bin/ |
- | #include < | + | 1.4.3 |
- | # | + | </cli> |
- | int main(int argc, char **argv) { | + | このツールは、指定されたオプションにしたがって、コンパイラ・リンカに渡すフラグをテキストとして出力します。 |
- | auto window = new Fl_Window(400, | + | 指定可能なオプションの一覧は[[fltk-config-help|こちら]]。 |
- | auto button1 = new Fl_Return_Button(100, | + | |
- | auto button2 = new Fl_Return_Button(100, | + | |
- | auto button3 = new Fl_Return_Button(100, | + | |
- | window-> | + | |
- | window-> | + | |
- | return Fl:: | + | |
- | } | + | |
- | </ | + | |
+ | C++コンパイラに指定するコンパイルフラグを出力するためのオプションは「%%--%%cxxflags」です。 | ||
- | ==== Fl_Toggle_Buttonクラス ==== | + | < |
+ | $ ~/ | ||
+ | -I/ | ||
+ | </ | ||
- | {{ : | + | パスのプリフィクスが/ |
+ | これはインストール時にCMAKE_INSTALL_PREFIXでそう指定したからこのようになっています。 | ||
- | <code cpp> | + | C++コンパイラとしてGCCを利用するので、この出力をそのままg++コマンドに渡してやります。 |
- | #include < | + | コピペするより、シェルのコマンド置き換えを利用したほうがずっと良いです。 |
- | #include <FL/Fl_Toggle_Button.H> | + | コマンド置き換えは '' |
- | #include <FL/Fl_Window.H> | + | 具体的には次のようにしてコンパイルします。 |
- | int main(int argc, char **argv) { | + | <cli> |
- | auto window = new Fl_Window(400, | + | $ g++ -c main.cpp `~/ |
- | auto button1 = new Fl_Toggle_Button(100, | + | </cli> |
- | auto button2 = new Fl_Toggle_Button(100, | + | |
- | auto button3 = new Fl_Toggle_Button(100, | + | |
- | window->end(); | + | |
- | | + | |
- | return Fl:: | + | |
- | } | + | |
- | </code> | + | |
+ | 「-c」は手動で与えている点に注意してください。 | ||
+ | これによって、リンクは行わず、コンパイルのみを行うこと指示しています。 | ||
- | ==== Fl_Shortcut_Buttonクラス | + | ==== 結果の確認 |
+ | コンパイラのオプションに間違いがなく、コンパイルエラーもなければ、何もメッセージは出力されずにコマンドが完了します。 | ||
+ | コンパイルされたオブジェクトファイルが生成されているはずなので、それを確認してみましょう。 | ||
- | {{ :fltk: | + | < |
+ | $ ls -l | ||
+ | 合計 12 | ||
+ | -rw-r--r-- 1 freemikan freemikan | ||
+ | -rw-rw-r-- 1 freemikan freemikan 7816 5月 23 01:01 main.o ←生成されたオブジェクトファイル | ||
+ | </ | ||
- | <code cpp> | + | main.oが存在していればOKです。 |
- | #include <FL/Fl.H> | + | |
- | #include < | + | |
- | #include < | + | |
- | int main(int argc, char **argv) { | + | ===== リンク ===== |
- | auto window | + | リンカオプションも同様にfltk-configの助けを借ります。 |
- | auto button1 | + | リンカオプションを出力するfltk-configのオプションは「%%--%%ldflags」です。 |
- | auto button2 | + | |
- | auto button3 | + | |
- | | + | |
- | | + | |
- | return Fl:: | + | |
- | } | + | |
- | </ | + | |
+ | <cli> | ||
+ | $ ~/ | ||
+ | -L/ | ||
+ | </ | ||
- | ==== Fl_Light_Buttonクラス ==== | + | これをコマンド置き換えでg++に渡してやります。 |
- | Fl_Light_Buttonクラス前後のクラス階層図 | + | <cli> |
- | {{ https:// | + | $ g++ -o hello-fltk main.o `~/MikanBox/ |
+ | </cli> | ||
- | {{ : | + | 「-o hello-fltk」は、生成する実行可能バイナリファイル名前をhello-fltkとすることを指示しています。 |
+ | 続けて、入力ファイルであるmain.oを指定しています。 | ||
- | <code cpp> | + | <note> |
- | #include <FL/Fl.H> | + | 入力ファイルmain.oの位置は意味を持ちます。 |
- | #include < | + | リンカオプションより後ろにしてはいけません。 |
- | #include < | + | |
- | int main(int argc, char **argv) { | + | <cli> |
- | auto window = new Fl_Window(400, | + | $ g++ -o hello-fltk `~/ |
- | auto button1 = new Fl_Light_Button(100, | + | </cli> |
- | auto button2 = new Fl_Light_Button(100, | + | |
- | auto button3 = new Fl_Light_Button(100, | + | |
- | window->end(); | + | |
- | | + | |
- | return Fl:: | + | |
- | } | + | |
- | </code> | + | |
- | === Fl_Check_Button === | + | これはリンクエラーになります。 |
+ | </ | ||
- | {{ : | ||
- | <code cpp> | + | ==== 結果の確認 |
- | #include < | + | リンクに問題がなければ、何もメッセージは出力されずにコマンドが終了します。 |
- | #include < | + | 実行可能バイナリファイルが生成されていることを確認しておきましょう。 |
- | #include < | + | |
- | + | ||
- | int main(int argc, char **argv) { | + | |
- | auto window | + | |
- | auto button1 | + | |
- | auto button2 | + | |
- | auto button3 | + | |
- | window-> | + | |
- | window-> | + | |
- | return Fl:: | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | === Fl_Radio_Light_Button | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <code cpp> | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | + | ||
- | int main(int argc, char **argv) { | + | |
- | auto window = new Fl_Window(400, | + | |
- | auto button1 = new Fl_Radio_Light_Button(100, | + | |
- | auto button2 = new Fl_Radio_Light_Button(100, | + | |
- | auto button3 = new Fl_Radio_Light_Button(100, | + | |
- | window-> | + | |
- | window-> | + | |
- | return Fl:: | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | === Fl_Round_Button === | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <code cpp> | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | + | ||
- | int main(int argc, char **argv) { | + | |
- | auto window = new Fl_Window(400, | + | |
- | auto button1 = new Fl_Round_Button(100, | + | |
- | auto button2 = new Fl_Round_Button(100, | + | |
- | auto button3 = new Fl_Round_Button(100, | + | |
- | window-> | + | |
- | window-> | + | |
- | return Fl:: | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | == Fl_Radio_Round_Button == | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | <code cpp> | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | + | ||
- | int main(int argc, char **argv) { | + | |
- | auto window = new Fl_Window(400, | + | |
- | auto button1 = new Fl_Radio_Round_Button(100, | + | |
- | auto button2 = new Fl_Radio_Round_Button(100, | + | |
- | auto button3 = new Fl_Radio_Round_Button(100, | + | |
- | window-> | + | |
- | window-> | + | |
- | return Fl::run(); | + | |
- | } | + | |
- | </ | + | |
+ | <cli> | ||
+ | $ ls -l | ||
+ | 合計 1644 | ||
+ | -rwxrwxr-x 1 freemikan freemikan 1670960 | ||
+ | -rw-r--r-- 1 freemikan freemikan | ||
+ | -rw-rw-r-- 1 freemikan freemikan | ||
+ | </ | ||
+ | hello-fltkが存在していればOKです。 | ||
+ | ===== Hello Worldプログラムの実行 ===== | ||
+ | 最後に、hello-fltkを実行して、問題なくFLTKのウィンドウが表示されることを確認しておきます。 | ||
- | ===== 参照 ===== | + | < |
+ | $ ./ | ||
+ | </ | ||
- | * [[https://www.fltk.org/ | + | {{ :fltk:fltk_hello.jpg |Hello FLTK!}} |
+ | このようなルック・アンド・フィールは典型的なFLTKアプリケーションのスタイルです。 | ||
+ | あくまで個人的にですが、ややレトロチックで2000年代初頭のような印象を受けます。 | ||
+ | 逆にそれが良いと思われれば幸いです。 |