4

私は gtk プログラミングと d が初めてで、gtkd ソースのデモを使用して学習しています。以下のコードをコンパイルしようとすると [archlinux で dmd-2.060 と gtkd-2.0 を使用しています]。

/*
    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関連のコードのコメントを外すと、コンパイルして正常に実行されます。

注: このコードは、sourceView gtkd demos ディレクトリの SVTest.d ファイルからのものです。

編集:私はコンパイルするためにdmd SVTest.dを行っていましたが、そのエラーが発生しました .dmd -L-ldl -L-lgtkd -L-lgtkdsv SVTest.dを実行しましたが、正常にコンパイルされました。プラグマ ステートメントを削除し、コンパイラ フラグを使用してコンパイルしようとすると失敗します。私はここで少し混乱しています.D docは、プラグマは情報をコンパイラに渡すためのものだと言いました! ソース コードをコンパイルするには、プラグマ フラグとコンパイラ フラグの両方が必要ですか? または私は何か間違ったことをしていますか?

更新:実際、プラグマの順序は重要でした。プラグマをこれに変更しました

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

今、私はただすることができます

dmd main.d

もともとやりたかったこと。

4

1 に答える 1

1

リンカーフラグの順序は重要だと思います。gtkd は共有オブジェクトをロードし、libdl を必要とするため、リストの最初に -l-Ldl を指定する必要があります。(端末で行いました)

pragma(lib, "dl"); を移動してみてください。最初の場所に移動し、それが違いを生むかどうかを確認します。

于 2012-11-27T01:27:33.227 に答える