Не удается скомпилировать код GtkD SourceView

Я новичок в программировании на gtk и изучаю с помощью демонстраций из gtkd. когда я пытаюсь скомпилировать код ниже [я использую dmd-2.060 и gtkd-2.0 на archlinux ].

/*
    Modified sourceview demo for learning gtk programming in d
*/

pragma(lib, "gtkd");
pragma(lib, "gtkdsv");
pragma(lib, "dl");


import gtk.MainWindow;
import gtk.Main;
import gtk.Widget;
//import gtk.TextView;


import gsv.SourceView;

import std.stdio;
import std.file;


/**
 * Demos for SourceView.
 * TODO on gsv: override methods from TextView, TextBuffer, etc
 */

class HelloWorld : MainWindow
{

    SourceView sourceView;
    //TextView textView;

    this()
    {
        super("GtkD SourceView");
        setBorderWidth(10);
        add(getSourceView());
        setDefaultSize(640,400);
        showAll();
    }

    private Widget getSourceView()
    {
        sourceView = new SourceView();
        return sourceView;

        //textView = new TextView();
        //return textView;
    }

}

void main(string[] args)
{
    Main.init(args);
    new HelloWorld();
    Main.run();

}

Я получаю такие ошибки

/usr/lib/libgtkdsv.a(SourceCompletionInfo.o):(.data+0x140): undefined reference to `_D3gtk8TextView12__ModuleInfoZ'
/usr/lib/libgtkdsv.a(SourceGutterRenderer.o):(.data+0xe8): undefined reference to `_D3gtk8TextView12__ModuleInfoZ'
/usr/lib/libgtkdsv.a(SourceGutterRenderer.o): In function `_D3gsv20SourceGutterRenderer20SourceGutterRenderer7getViewMFZC3gtk8TextView8TextView':
(.text._D3gsv20SourceGutterRenderer20SourceGutterRenderer7getViewMFZC3gtk8TextView8TextView+0x7e): undefined reference to `_D3gtk8TextView8TextView7__ClassZ'
/usr/lib/libgtkdsv.a(SourceGutterRenderer.o): In function `_D3gsv20SourceGutterRenderer20SourceGutterRenderer7getViewMFZC3gtk8TextView8TextView':
(.text._D3gsv20SourceGutterRenderer20SourceGutterRenderer7getViewMFZC3gtk8TextView8TextView+0x94): undefined reference to `_D3gtk8TextView8TextView6__ctorMFPS4gtkc8gtktypes11GtkTextViewZC3gtk8TextView8TextView'
collect2: error: ld returned 1 exit status
--- errorlevel 1

Но когда я комментирую код, связанный с SourceView, и раскомментирую код, связанный с TextView, он компилируется и работает нормально.

Примечание. Этот код взят из файла SVTest.d в демоверсии исходного кода gtkd.

Редактировать: я делал dmd SVTest.d для компиляции, которая давала мне эту ошибку, теперь я сделал dmd -L-ldl -L-lgtkd -L-lgtkdsv SVTest.d, и он скомпилирован нормально. Теперь, если я удалю операторы pragma и попытаюсь скомпилировать с флагами компилятора, это не удастся. Я немного запутался, док сказал, что прагма была для передачи информации компилятору! мне нужны флаги прагмы и компилятора для компиляции исходного кода? или я что-то не так делаю?

Обновление: действительно, порядок прагмы имел значение, я изменил прагму на это

pragma(lib, "gtkdsv");
pragma(lib, "gtkd");
pragma(lib, "dl");

Теперь я могу просто сделать

dmd main.d

что я изначально хотел сделать.

1 ответ

Решение

Я считаю, что порядок флагов компоновщика имеет значение. gtkd загружает общие объекты и нуждается в libdl, поэтому -l-Ldl должен быть первым в списке. (что вы сделали на терминале)

Попробуйте переместить прагму (lib, "dl"); на первое место, и посмотреть, если это имеет значение.

Другие вопросы по тегам