Dlangui가 빌드 할 수없는 것을 빌드했습니다.

10122 단어 dlang
어째서 이런 기사를 썼는가 하면, 지금 만들고 있는 데스크탑 마스코트를 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) 컴파일이 통과되지 않습니다

  • 본가 페이지 샘플 코드가 오래되었습니다

  • 이것들을 하나씩 부서 갑니다.

    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();
    }
    

    세 번째 줄을 아래 코드의 위 줄에서 아래 줄 줄로 다시 씁니다.

    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를 실행하면 이러한 창이 나타납니다.

    끝에



    Boost 라이센스로 D언어로 쓰여져 있어 Windows, OSX, Linux로 움직이면 편리할 것 같은 생각이 듭니다.

    실수나 오자, 오식 등이 있으면 가르쳐 주시면 감사하겠습니다.

    좋은 웹페이지 즐겨찾기