MacでgtkmmのSimple Exampleをコンパイルしてみた

# はじめに

gtkmmというGUIツールキットがあります。
次のようなものです。

> gtkmmはGUIツールキットであるGTK+のC++バインディング。C++言語のオブジェクト指向機能を用いてGTK+ライブラリを利用することができる。
> gtkmmはGTK+のラッパーであり、したがってUnix系OSのほかにもWindows、macOS上で動作する。
> オープンソースの組込みOSであるMaemoでも機能制限版のgtkmmを利用することができる。

引用元 gtkmm https://ja.wikipedia.org/wiki/Gtkmm

その online book:

Programming with gtkmm 3
https://developer.gnome.org/gtkmm-tutorial/stable/index.html.en

の次の章:

Simple Example
https://developer.gnome.org/gtkmm-tutorial/stable/sec-basics-simple-example.html.en

にあるソースのコンパイルをやってみました。

# 環境・前提条件

Homebrew がインストールされていること
https://brew.sh/index_ja.html 

```bash
$ brew --version
Homebrew 1.2.4
Homebrew/homebrew-core (git revision f41f; last commit 2017-07-09)
```

OS Xバージョン

```bash
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.5
BuildVersion:	16F73
```

# 手順

## gtkmm3インストール

単純にHomebrewで`gtkmm3`をインストールします。

```bash
$ brew install gtkmm3
```

## PKG_CONFIG_PATH環境変数設定

Simple Exampleの記事にある、コンパイルの手順の引数の`pkg-config`を実行すると、次のエラーになりました。

```bash
$ pkg-config gtkmm-3.0 --cflags --libs
Package gtkmm-3.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtkmm-3.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gtkmm-3.0' found
```

メッセージにある`PKG_CONFIG_PATH`環境変数へパスを指定してみます。
手元の環境では`gtkmm-3.0.pc`下のパスにありました。

```bash
$ find /usr/local/Cellar -name "*.pc"  | grep mm
/usr/local/Cellar/atkmm/2.24.2/lib/pkgconfig/atkmm-1.6.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-1.0.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-ft-1.0.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-pdf-1.0.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-png-1.0.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-ps-1.0.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-quartz-1.0.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-quartz-font-1.0.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-quartz-image-1.0.pc
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig/cairomm-svg-1.0.pc
/usr/local/Cellar/glibmm/2.52.0/lib/pkgconfig/giomm-2.4.pc
/usr/local/Cellar/glibmm/2.52.0/lib/pkgconfig/glibmm-2.4.pc
/usr/local/Cellar/gtkmm/2.24.5/lib/pkgconfig/gdkmm-2.4.pc
/usr/local/Cellar/gtkmm/2.24.5/lib/pkgconfig/gtkmm-2.4.pc
/usr/local/Cellar/gtkmm3/3.22.1/lib/pkgconfig/gdkmm-3.0.pc
/usr/local/Cellar/gtkmm3/3.22.1/lib/pkgconfig/gtkmm-3.0.pc
/usr/local/Cellar/pangomm/2.40.1/lib/pkgconfig/pangomm-1.4.pc
```

`PKG_CONFIG_PATH`環境変数へパスを指定し、
`pkg-config`を実行するとまた違うエラーになりました。

```bash
$ export PKG_CONFIG_PATH=/usr/local/Cellar/gtkmm3/3.22.1/lib/pkgconfig
$ pkg-config gtkmm-3.0 --cflags --libs
Package atkmm-1.6 was not found in the pkg-config search path.
Perhaps you should add the directory containing `atkmm-1.6.pc'
to the PKG_CONFIG_PATH environment variable
Package 'atkmm-1.6', required by 'gtkmm-3.0', not found
```

エラーメッセージを見ては環境変数に追加し実行を繰り返した結果、
下のような環境変数設定になりました。

```bash
PKG_CONFIG_PATH=\
/usr/local/Cellar/atk/2.24.0/lib/pkgconfig:\
/usr/local/Cellar/atkmm/2.24.2/lib/pkgconfig:\
/usr/local/Cellar/cairo/1.14.10/lib/pkgconfig:\
/usr/local/Cellar/cairomm/1.12.2/lib/pkgconfig:\
/usr/local/Cellar/gdk-pixbuf/2.36.6/lib/pkgconfig:\
/usr/local/Cellar/glib/2.52.3/lib/pkgconfig:\
/usr/local/Cellar/glibmm/2.52.0/lib/pkgconfig:\
/usr/local/Cellar/gtk+3/3.22.16/lib/pkgconfig:\
/usr/local/Cellar/gtkmm3/3.22.1/lib/pkgconfig:\
/usr/local/Cellar/libepoxy/1.4.3/lib/pkgconfig:\
/usr/local/Cellar/libpng/1.6.30/lib/pkgconfig:\
/usr/local/Cellar/libsigc++/2.10.0/lib/pkgconfig:\
/usr/local/Cellar/pango/1.40.6/lib/pkgconfig:\
/usr/local/Cellar/pangomm/2.40.1/lib/pkgconfig:\
/usr/local/Cellar/pcre/8.37/lib/pkgconfig
```

その設定で`pkg-config`を実行した結果です。
見やすいように改行を入れてます。

```bash
$ pkg-config gtkmm-3.0 --cflags --libs
-D_REENTRANT 
-I/usr/local/Cellar/atk/2.24.0/include/atk-1.0 
-I/usr/local/Cellar/atkmm/2.24.2/include/atkmm-1.6 
-I/usr/local/Cellar/cairo/1.14.10/include/cairo 
-I/usr/local/Cellar/cairomm/1.12.2/include/cairomm-1.0 
-I/usr/local/Cellar/cairomm/1.12.2/lib/cairomm-1.0/include 
-I/usr/local/Cellar/gdk-pixbuf/2.36.6/include/gdk-pixbuf-2.0 
-I/usr/local/Cellar/glib/2.52.3/include/gio-unix-2.0/ 
-I/usr/local/Cellar/glib/2.52.3/include/glib-2.0 
-I/usr/local/Cellar/glib/2.52.3/lib/glib-2.0/include 
-I/usr/local/opt/gettext/include 
-I/usr/local/Cellar/glibmm/2.52.0/include/giomm-2.4 
-I/usr/local/Cellar/glibmm/2.52.0/lib/giomm-2.4/include 
-I/usr/local/Cellar/glibmm/2.52.0/include/glibmm-2.4 
-I/usr/local/Cellar/glibmm/2.52.0/lib/glibmm-2.4/include 
-I/usr/local/Cellar/gtk+3/3.22.16/include/gtk-3.0/unix-print 
-I/usr/local/Cellar/gtk+3/3.22.16/include/gtk-3.0 
-I/usr/local/Cellar/gtkmm3/3.22.1/include/gtkmm-3.0 
-I/usr/local/Cellar/gtkmm3/3.22.1/lib/gtkmm-3.0/include 
-I/usr/local/Cellar/gtkmm3/3.22.1/include/gdkmm-3.0 
-I/usr/local/Cellar/gtkmm3/3.22.1/lib/gdkmm-3.0/include 
-I/usr/local/Cellar/libepoxy/1.4.3/include 
-I/usr/local/Cellar/libpng/1.6.30/include/libpng16 
-I/usr/local/Cellar/libsigc++/2.10.0/include/sigc++-2.0 
-I/usr/local/Cellar/libsigc++/2.10.0/lib/sigc++-2.0/include 
-I/usr/local/Cellar/pango/1.40.6/include/pango-1.0 
-I/usr/local/Cellar/pangomm/2.40.1/include/pangomm-1.4 
-I/usr/local/Cellar/pangomm/2.40.1/lib/pangomm-1.4/include 
-I/usr/local/Cellar/pcre/8.37/include 
-I/opt/local/include/harfbuzz 
-I/opt/local/include/pixman-1 
-I/opt/local/include 
-I/opt/local/include/freetype2 
-I/opt/local/include 
-I/opt/local/include/freetype2 
-I/opt/local/include 
-L/usr/local/Cellar/atk/2.24.0/lib 
-L/usr/local/Cellar/atkmm/2.24.2/lib 
-L/usr/local/Cellar/cairo/1.14.10/lib 
-L/usr/local/Cellar/cairomm/1.12.2/lib 
-L/usr/local/Cellar/gdk-pixbuf/2.36.6/lib 
-L/usr/local/Cellar/glib/2.52.3/lib 
-L/usr/local/opt/gettext/lib 
-L/usr/local/Cellar/glibmm/2.52.0/lib 
-L/usr/local/Cellar/gtk+3/3.22.16/lib 
-L/usr/local/Cellar/gtkmm3/3.22.1/lib 
-L/usr/local/Cellar/libsigc++/2.10.0/lib 
-L/usr/local/Cellar/pango/1.40.6/lib 
-L/usr/local/Cellar/pangomm/2.40.1/lib
-lgtkmm-3.0
-latkmm-1.6
-lgdkmm-3.0
-lgiomm-2.4
-lpangomm-1.4
-lglibmm-2.4
-lgtk-3
-lgdk-3
-lpangocairo-1.0
-lpango-1.0
-latk-1.0
-lcairo-gobject
-lgio-2.0
-lcairomm-1.0
-lcairo
-lsigc-2.0
-lgdk_pixbuf-2.0
-lgobject-2.0
-lglib-2.0
-lintl 
-Wl,-framework 
-Wl,CoreFoundation
```

## ソースをコンパイル

記事にあるソースをファイル名`base.cc`で保存しました。

```bash
$ cat base.cc
#include <gtkmm.h>

int main(int argc, char *argv[])
{
  auto app =
    Gtk::Application::create(argc, argv,
      "org.gtkmm.examples.base");

  Gtk::Window window;
  window.set_default_size(200, 200);

  return app->run(window);
}
```

オプションに`-std=c++11`を加えてコンパイルします。
実行ファイル`base`ができました。

```bash
kuwahara-mac:gtkmm3 mitsuaki$ g++ -std=c++11 base.cc -o base `pkg-config gtkmm-3.0 --cflags --libs`
kuwahara-mac:gtkmm3 mitsuaki$ ls -l base*
-rwxr-xr-x  1 mitsuaki  staff  9772  7  9 19:43 base
-rw-r--r--  1 mitsuaki  staff   233  7  9 18:03 base.cc
```
## 実行する

Finderから実行ファイル`base`を実行すると、ターミナルが開き、Windowが表示されました。

<img width="918" alt="gtkmm-simple-example.png" src="https://qiita-image-store.s3.amazonaws.com/0/77421/8026578f-7b8e-7fb4-78cb-9df432a407da.png">

以上です。
ありがとうございました。