2012-11-18 60 views
4

我是新來的gtk編程和d和學習使用gtkd源演示。當我嘗試編譯下面的代碼[我在archlinux上使用dmd-2.060和gtkd-2.0]。無法編譯GtkD SourceView代碼

/* 
    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是用來傳遞信息給編譯器的!我是否需要編譯器標記和編譯器標記來編譯源代碼?或者我做錯了什麼?

更新:事實上,編譯順序要緊,我改變了編譯這個

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

現在就可以做

dmd main.d 

我本來想這樣做。

+0

你用什麼來編譯?它看起來像鏈接器找不到所需的模塊。你確定你在旗幟中包括他們嗎? – scry

回答

1

我認爲鏈接器標誌的順序很重要。 gtkd加載共享對象,並且需要libdl,因此-l-Ldl需要位於列表中的第一位。 (你在終端上做的)

嘗試移動編譯指示(lib,「dl」);到第一個地方,看看這是否有所作爲。