LoginSignup
6
5

More than 5 years have passed since last update.

Dlanguiがビルド出来ないのをビルド通しました。

Posted at

なんでこんな記事を書いたかというと、今作っているデスクトップマスコットをD言語で書きたくてGUIライブラリを探している途中でこのライブラリを見つけたのですが、ビルド出来ず悔しくなってデスクトップマスコットを作るという目標をほったらかして試行錯誤し、どうにか動かせて嬉しかたので書きました。
Linux Mint 17.2でのものです。WindowsやOSXでも同様のことが発生するのか、どう解決すればいいのかは分かりません

Dlanguiとは

本家のページ

D言語で書かれたGUIライブラリです。POSIX/Windows対応でOSX,Windows,Linuxで動きます。FreeBSDも動く気がします。
ライセンスはBoost1.0となっています。
作者はbugginsという方でDlangIDEというのも作っているようです。今度使ってみようと思っています。

はじめに

本家のページ
本家のページの通り、SDL2のインストールかLinuxならXCBのインストールをします。
dub、dmdをインストールしていないならインストールを行います

どうビルドを通したか

  • gl3nのバージョンが古い
  • dlibのコンパイルが通らない
  • dlangui(master)のコンパイルが通らない
  • 本家のページのサンプルコードが古い

これらを1つづつ潰していきます。

gl3n

自分の場合だと、まずgl3nの静的リンクライブラリが生成されませんでした。更に警告も出ます。
これの原因はよく分かりませんがバージョンを1.2.0に引き上げてやればどうにかなります。DUBのプロジェクト内のdub.selection.jsonの、"gl3n":"1.0.1",(1.0.1の部分は環境によっては違うかも知れません)を"gl3n":"1.2.0"に書き換えます。
無理やりバージョンを上げているので少し不安ですが、これしか無い気がするのでこれで行きます。

dlib

dlib/coding/zlib.dでコンパイルエラーが発生します。内容は、標準ライブラリのetc.c.zlibのz_stream.total_outをuint型へ暗黙の型変換が出来ないというものです。原因は、z_stream.total_out型がcore.stdc.config.dのc_long型として宣言されており、このc_long型が64bitならulong,32bitならuintとなることです。
32bitならuint -> uintなので何の問題もないのですが、64bitだとulong -> uintとなり、コンパイルエラーが発生します。
castするなりstd.conv:toを使うなりすればいいと思います。自分はどちらのほうが良いのかよく分かりません。

dlib/coding/zlib.dの75行目と85行目の

zlib.d
return zlibStream.total_out;

を下のコードのどちらかに書き直します。

zlib.d
return cast(uint)zlibStream.total_out;

return zlibStream.total_out.to!int;

toを使う場合は

zlib.d
import std.conv : to;

が必要です。

dlanguiのコンパイルエラー

gl3nと同じ方法で、バージョンを0.6.32と指定してやると直りました。

サンプルコードの書き直し

main.d

// main.d
import dlangui.all;
mixin DLANGUI_ENTRY_POINT;

/// entry point for dlangui based application
extern (C) int UIAppMain(string[] args) {
    // resource directory search paths
    string[] resourceDirs = [
        appendPath(exePath, "../res/"),   // for Visual D and DUB builds
        appendPath(exePath, "../../res/") // for Mono-D builds
    ];

    // setup resource directories - will use only existing directories
    Platform.instance.resourceDirs = resourceDirs;
    // select translation file - for english language
    Platform.instance.uiLanguage = "en";
    // load theme from file "theme_default.xml"
    Platform.instance.uiTheme = "theme_default";

    // create window
    Window window = Platform.instance.createWindow("My Window", null);
    // create some widget to show in window
    window.mainWidget = (new Button()).text("Hello world"d).textColor(0xFF0000); // red text
    // show window
    window.show();
    // run message loop
    return Platform.instance.enterMessageLoop();
}

3行目を下のコードの上の行から下の行のものへと書き直します。

main.d
mixin DLANGUI_ENTRY_POINT;

mixin APP_ENTRY_POINT;

そして、dlangui.allなどというものは存在しないので、

main.d
import dlangui.all;

import dlangui;

上の行のコードを下の行のコードに書き換えます
更に僕はdubとテキストエディタで書いているので、resorce云々を削ります。最終的にこのようなコードになりました。

main.d
import dlangui.all;

mixin APP_ENTRY_POINT;

extern (C) int UIAppMain(string[] args)
{
    Platform.instance.uiLanguage = "ja";
    Platform.instance.uiTheme = "theme_default";

    auto window = Platform.instance.createWindow("Hello World",null);
    window.mainWidget = (new Button()).text("Hello World"d).textColor(0xFF0000);
    window.show();
    return Platform.instance.enterMessageLoop();
}

これでdub runを実行すると、このようなウィンドウが現れるはずです。Screenshot_from_2015-09-04 02:00:58.png

終わりに

BoostライセンスでD言語で書かれておりWindows,OSX,Linuxで動くと便利そうな気がします。

間違いや誤字、誤植などがあれば教えていただけると幸いです。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5