やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C++描画ライブラリcairoを使おうと思ったが失敗したログ

ベクタ画像ライブラリcairoを使ってみようと思ったが、必要なGTK+の環境構築ができなかったログ。

発見

こちらのURLでcairoの存在を知った。 C++の標準ライブラリになるかもしれないという点に注目した。

期待

cairoをGDI, GDI+, DirectX9のように描画アーキテクチャとして加えたい。 たぶんWindowsでのcairoはGDIのラッパとかなんだろうけど。

OS特化でない描画APIが使えるなら嬉しい。 うまくいけば異なるOSでも同じコードで同じ動作をするアプリが作れるかもしれない。 また、WindowsMessageLoopに関しても、後述のGTK+で代替できるのかもしれない。 ようはクロスプラットフォームなアプリが作れるかもしれない。

cairo

cairoC言語の描画ライブラリ。

cairomm

cairommはcairoをC++でラップしたものらしい。

GTK+

cairoはGTK+が必要っぽい?

公式ではWindowsバイナリがない? いろいろなところにある。

WindowsXP, VC++2010Expressで動作するバイナリを探すのが大変そう。 ソースコードからビルドするなんて考えたくない。

周辺のライブラリも一式揃えてバイナリ化したものでないと使えないだろう。 そんなもの存在するだろうか。

GTKmm

どうやらGTK+自体はC言語ライブラリらしい。 それをC++でラップしたのがGTKmmと思われる。

Glade

GladeGTK+のUIデザイナらしい。GTK+を内包しているっぽい。 cairoはあるのか?

こちらが参考になりそう。

ためしてみる

Gladeはデザイナがメインだろう。でもデザイナはいらない。 以下のライブラリ一式っぽいバイナリで試した。

結果からいえば使えなかった。「ライブラリの形式が無効です」というリンク・エラーで。 たぶんバイナリのコンパイル環境とこちらの環境が違うのだろう。 コンパイラのバージョンか、OSのバージョンか。

3.10.4

http://win32builder.gnome.org/

上記URLから以下のファイルをダウンロードした。約27MB。解凍後は約114MB。重すぎる。

gtk+-bundle_3.10.4-20131202_win32.zip

フォルダを確認してみると、include配下にcairoもあった。

参考

参照設定はこちらが参考になるかも。

Hello World的なやつはこちらこちらが参考になるかも。

GTK+とQtの比較はこちら

他の描画ライブラリはこちら

コード

#include <gtk-3.0/gtk/gtk.h>

int main(int argc, char* argv[])
{
    gtk_init(&argc, &argv);

    GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    //gtk_widget_set_usize(window, 300, 200);

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);   
    gtk_window_set_title(GTK_WINDOW(window), "GTK+ with VS2010");

    gtk_widget_show(window);     

    gtk_main();   
    return 0;
}

たったひとつの gtk.h をインクルードするために、次々とインクルードフォルダの設定が必要になった。面倒くさすぎる。

C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\include\;C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\include\gtk-3.0;C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\include\glib-2.0;C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\lib\glib-2.0\include\;C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\include\pango-1.0;C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\include\cairo;C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\include\gdk-pixbuf-2.0;C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\include\atk-1.0;

やっとincludeのパスが通りきったと思ったら以下のエラー。

error C3861: 'gtk_widget_set_usize': 識別子が見つかりませんでした

とりあえずgtk_widget_set_usizeの行をコメントアウトしたら、以下のリンクエラー。 コンパイルは通ったっぽい。

1>------ ビルド開始: プロジェクト: HelloGtkPlus201608241713, 構成: Debug Win32 ------
1>  Program.cpp
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_main が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_widget_show が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_window_set_title が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_window_get_type が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _g_signal_connect_data が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _g_type_check_instance_cast が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_main_quit が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_window_new が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_init_abi_check が関数 _main で参照されました。
1>C:\root\pj\Do\cpp\HelloGtkPlus201608241713\Debug\HelloGtkPlus201608241713.exe : fatal error LNK1120: 外部参照 9 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

ライブラリ参照

// GTK+ bin配下すべて。
// 一体どれが必要なのか。不要なものはあるのか。まったくわからない。

#pragma comment(lib, "libatk-1.0-0.dll")
#pragma comment(lib, "libcairo-2.dll")
#pragma comment(lib, "libcairo-gobject-2.dll")
#pragma comment(lib, "libcairo-script-interpreter-2.dll")
#pragma comment(lib, "libcroco-0.6-3.dll")
#pragma comment(lib, "libffi-6.dll")
#pragma comment(lib, "libfontconfig-1.dll")
#pragma comment(lib, "libfreetype-6.dll")
#pragma comment(lib, "libgailutil-3-0.dll")
#pragma comment(lib, "libgdk-3-0.dll")
#pragma comment(lib, "libgdk_pixbuf-2.0-0.dll")
#pragma comment(lib, "libgio-2.0-0.dll")
#pragma comment(lib, "libglib-2.0-0.dll")
#pragma comment(lib, "libgmodule-2.0-0.dll")
#pragma comment(lib, "libgobject-2.0-0.dll")
#pragma comment(lib, "libgthread-2.0-0.dll")
#pragma comment(lib, "libgtk-3-0.dll")
#pragma comment(lib, "libiconv-2.dll")

//#pragma comment(lib, "libintl-8.dll")

#pragma comment(lib, "libjasper-1.dll")
#pragma comment(lib, "libjpeg-9.dll")
#pragma comment(lib, "liblzma-5.dll")
#pragma comment(lib, "libpango-1.0-0.dll")
#pragma comment(lib, "libpangocairo-1.0-0.dll")
#pragma comment(lib, "libpangowin32-1.0-0.dll")
#pragma comment(lib, "libpixman-1-0.dll")
#pragma comment(lib, "libpng16-16.dll")
#pragma comment(lib, "librsvg-2-2.dll")
#pragma comment(lib, "libtiff-5.dll")
#pragma comment(lib, "libxml2-2.dll")
#pragma comment(lib, "pthreadGC2.dll")

//#pragma comment(lib, "zlib1.dll")

「ライブラリの形式が無効です」というエラー。

1>------ ビルド開始: プロジェクト: HelloGtkPlus201608241713, 構成: Debug Win32 ------
1>  Program.cpp
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libatk-1.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libcairo-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libcairo-gobject-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libcairo-script-interpreter-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libcroco-0.6-3.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libffi-6.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libfontconfig-1.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libfreetype-6.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgailutil-3-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgdk-3-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgdk_pixbuf-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgio-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libglib-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgmodule-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgobject-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgthread-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgtk-3-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libiconv-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libjasper-1.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libjpeg-9.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\liblzma-5.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpango-1.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpangocairo-1.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpangowin32-1.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpixman-1-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpng16-16.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\librsvg-2-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libtiff-5.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libxml2-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\pthreadGC2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libatk-1.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libcairo-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libcairo-gobject-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libcairo-script-interpreter-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libcroco-0.6-3.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libffi-6.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libfontconfig-1.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libfreetype-6.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgailutil-3-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgdk-3-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgdk_pixbuf-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgio-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libglib-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgmodule-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgobject-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgthread-2.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libgtk-3-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libiconv-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libjasper-1.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libjpeg-9.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\liblzma-5.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpango-1.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpangocairo-1.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpangowin32-1.0-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpixman-1-0.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libpng16-16.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\librsvg-2-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libtiff-5.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\libxml2-2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>C:\root\pj\lib\c\gtk+-bundle_3.10.4-20131202_win32\bin\\pthreadGC2.dll : warning LNK4003: ライブラリの形式が無効です。ライブラリは無視されます。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_main が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_widget_show が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_window_set_title が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_window_get_type が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _g_signal_connect_data が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _g_type_check_instance_cast が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_main_quit が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_window_new が関数 _main で参照されました。
1>Program.obj : error LNK2019: 未解決の外部シンボル _gtk_init_abi_check が関数 _main で参照されました。
1>C:\root\pj\Do\cpp\HelloGtkPlus201608241713\Debug\HelloGtkPlus201608241713.exe : fatal error LNK1120: 外部参照 9 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

私の環境(Windows XP, VC++2010Express)では使えないということかな。

ということで、cairoどころかGTK+の利用に失敗した。

たぶんコンパイラのバージョンが違うのだろう。

つぎはGladeというのを試してみよう。

こうやって使えるものと使えないものを一つ一つ選別していくしかない。 バイナリはたくさんあるので忘れそう。 試したものと結果と作業ログを残しておこう。