FreeBSD 8.1 上で netbeans 7.0 を用いて、Gtk2 アプリケーションを作成する方法。

make ではなく、gmake を使う必要がある。

 まず、FreeBSD 上の NetBeansC/C++ アプリを構築するためには、gmake を使用する必要があるようだ。その設定方法については、前回の日記に書き記しておいた。

 なので、今回はその前回に作った、標準出力に "Hello world." と表示するプログラムを作成するプロジェクトに手を加えて、"Hello World." という題名の Gtk2 の window を X Window 上に表示するプログラムを作ってみることにした。

 まず前回の main.c を以下のように書き換える。

/* 
 * File:   main.c
 * Author: あなたの名前
 *
 * Created on 2011/08/18, 15:42
 */

#include <stdio.h>
#include <stdlib.h>

#include <gtk/gtk.h>

/*
 * 
 */
int main(int argc, char** argv) {
    
    GtkWidget *window;
    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 100);
    gtk_window_set_title(GTK_WINDOW(window), "Hello world.");
    gtk_widget_show(window);

    g_signal_connect(window, "destroy",
		    G_CALLBACK (gtk_main_quit), NULL);

    gtk_main();
    
    printf("Hello World is done. \n");
    return (EXIT_SUCCESS);
}

 上記のソースコードは、たしか Getting Started あたりの gtk2 についてのチュートリアルのページから拾ってきたプログラムだったと思う。(手動でコピーをかさねるうちに多少、変なぐあいに手が加わって、少々ちがったものになっているかもしもれないが)

 このソースコードNetBeans を使うまでもなく、端末から、

>gcc -Wall -g main.c -o helloworld `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

 とでも入力して、リターンキーを押せば、多分、helloworld という名前の実行ファイルが生成されるだろうし、さらに端末から、

>./helloworld

 というようにその実行ファイル名を入力して、リターンキーを押せば、画面に「Hello World.」という題名のついた Gtk2 ウインドウも表示されることだろう。でもまあせっかくだし、今回は、この一連の処理を、端末からではなく、NetBeans を使って行えるようにしようというわけだ。

Gtk2 アプリを構築するために必要なインクルードファイルと、ライブラリファイルを NetBeans に教えてやる必要がある。

 このまま NetBeans に、実行ファイルを構築させようとしても、うまくはいかない。この上記のコードをコンパイルするためには、インクルードしなければならないファイルがたくさん必要であるし、コンパイルに成功したとしても、そこから実行ファイルを完成させるためには、さらにいくつかのライブラリファイルをリンクしてやる必要がある。

 つまり、実行ファイルをうまく構築するためには、NetBeans のやつに、いろいろ教えてあげる必要があるわけだ。このソースファイル(main.c)をコンパイルするためには、どのようなインクルードファイルが必要であるかとか、コンパイルずみのファイルをリンクさせて実行ファイルを生成するには、どのようなライブラリファイルをいっしょにリンクしなければならないのかなどを。その教える方法を以下の節では、順番に見ていこう。

余談

 ところで、さきほどちらっと言及したけれど、端末からなら、あっさり一行のコマンドで helloworld という実行ファイルを生成することができた。それは、なぜかといえば、そのコマンド中の pkg-config --cflags gtk+-2.0pkg-config --libs gtk+-2.0 などのおかげ。試しに端末から、

> pkg-config --cflags gtk+-2.0

 などと入力してやれば良く判る。そうすれば gtk2 アプリを構築するために必要なインクルードファイルの場所を示したディレクトリなどが、ずらずらと表示されるし、

> pkg-config --cflags gtk+-2.0

 などと入力すれば、必要なライブラリファイルなどが、ずらずらと表示されるというわけ。先ほどの一行のコマンド内では、この二つの pkg-config コマンドがバッククォートで囲まれている。なので、この二つの pkg-config の出力結果が、gcc にオプションとして与えられることになる。その与えられたオプションによって、gcc は 正しく helloworld という実行ファイルを生成することができた。(以上、余談おわり)

インクルードするべきディレクトリを NetBeans に教えてやる方法。

 さてここから本題に戻って、NetBeans にインクルードするべきディレクトリを教える方法。まず、NetBeans のプロジェクト・ウインドウにて、前回、作った "HelloWorld" というプロジェクトを右クリックし、表示されたポップアップメニューの一番下から「プロパティー」という項目を選択。すると「プロジェクトプロパティー - HelloWorld」というダイアログが開く。このダイアログの左にある「カテゴリ」の中の「構築」というノードから、「Cコンパイラ」という項目を選択。

 つぎに、このダイアログの右側にある「構成:」から「<すべての構成>」を選んで、その下の「一般」というノードから「インクルードディレクトリ」の「...」をクリック。

 すると「Debug, Release - インクルードディレクトリ」というダイアログが開くので、そのダイアログの「追加」というボタンをクリック。すると「ディレクトリを選択」というダイアログが開く。

 さて。ここで NetBeans は、しばらく放置しておいて、つぎに端末から

> pkg-config --cflags gtk+-2.0

と入力して、リターンキーを押すと、gtk2 が必要とするインクルードディレクトリが、ずらずらと端末上に表示される。たとえば "-I/usr/local/include/gtk-2.0 -I/usr/local/lib/gtk-2.0/include <以下略>" などのような感じ。

 この、ずらずらと表示された "-I/usr/local/include/gtk-2.0" などから "-I" の部分を取り除いた "/usr/local/include/gtk-2.0" の部分こそが、我々が求めているものだ。つまりこの "/usr/local/include/gtk-2.0" こそが、gtk2 アプリを構築するために必要なインクルードファイルの所在地なわけだ。

 なので、この "/usr/local/include/gtk-2.0" を、先ほどの放置しておいた NetBeans の「ディレクトリを選択」というダイアログの下のほうの「ファイル名」というところに入力して、「選択」をクリック。

 これで、われらの NetBeans は、/usr/local/include/gtk-2.0 ディレクトリにあるファイルこそが、HelloWorld というプロジェクトをコンパイルするさいには必要であることを理解してくれた。あとは同じようにして、"pkg-config --cflags gtk+-2.0" がずらずらと表示した、残りのすべてのディレクトリも、ぜんぶ追加していけば良い。それが終わったら、一応、安全のために、現在表示されているすべてのダイアログの「了解」ボタンをクリックしていって、プロジェクトに今回、加えられた設定を保存しておこう。

 これで必要なインクルードファイルは指定しおわったので、コンパイルは可能になった。しかしこのままでは、コンパイルに成功しても、そのつぎのリンクに失敗してしまう。リンクを成功させて実行ファイルを完成させるためには、リンク時に必要なライブラリファイルのことも NetBeans に教えてやらなければならない。

リンクするべきライブラリを NetBeans に教えてやる方法。

 さきほどと同じようにしてプロジェクトウインドウの "HelloWorld" を右クリックする。そして開いたポップアップメニューの一番下から「プロパティー」を選択。

 すると先ほどと同じように「プロジェクトプロパティー - HelloWorld」というダイアログが開くので、このダイアログの左にある「カテゴリ」の中の「構築」というノードから、今度は「リンカー」という項目を選択。そして右側から、先ほどと同じように <すべての構成> を選択して、下のほうにある「ライブラリ」の「...」をクリック。

 すると「Debug, Release - ライブラリ」というダイアログが開くので、ここの「ライブラリファイルを追加」をクリック。すると「ライブラリファイルを選択」というダイアログが開く。この開いたダイアログは、そのまま放置して、つぎに端末から、

> pkg-config --libs gtk+-2.0

 と入力してリターンキーを押す。すると gtk2 アプリを構築するために必要なライブラリがずらずらと表示される。たとえば、 "-L/usr/local/lib -lgtk-x11-2.0 -lgdk-x11-2.0 <以下略>" など。

 あとは、さきほどの「ライブラリファイルを選択」ダイアログに戻り、必要なライブラリファイルを追加していけば良い。うちの環境の場合は、さきほどの pkg-config の出力結果が、"-L/usr/local/lib" となっているので、まずこのダイアログで /usr/local/lib ディレクトリに移動する。そして、さきほどの pkg-config の出力結果には "-lgtk-x11-2.0" とあるので、この "-l" を "lib" と読み替えて、"libgtk-x11-2.0" で始まるライブラリファイルを、さきほどの /usr/local/lib ディレクトリのディレクトリから探す。

 とりあえず、今回の HelloWorld の場合は、libgtk-x11-2.0.so だけを指定してやれば動作するので、このファイル一つを指定したら、あとは現在開いているすべてのダイアログの「了解」ボタンを押して、ダイアログを閉じてしまおう。

コンパイルして、リンクして、主プロジェクトを実行。

 あとは、いつものようにメニューバーから「実行」をクリックして、そこから「主プロジェクトを実行」をクリックするなどしてみよう。これでしばらく待って、うまく実行ファイルの構築が成功すれば、"Hello World." というタイトルの Gtk2 ウィンドウが開くはず。うまくウインドウが表示されれば、めでたしめでたし。

必要なもの

  • /usr/ports/java/netbeans/
  • /usr/ports/devel/gmake/
  • /usr/ports/x11-toolkits/gtk20/
  • /usr/ports/devel/pkg-config/

 多分、今回、必要なものは上記のような感じだと思う。NetBeans は、ともかくとして、他のものは、Gnome とか xfce とかの最新のものを入れていれば、たぶん一緒にインストールされているんじゃないかなーと思うけれど自信はない。

 あと、多分、今回のようにいちいちインクルードディレクトリを一つ一つ指定しなくても、コンパイル時のオプションとして、`pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0` などを指定してやるだけでも、うまく実行ファイルを構築できるような気がする。