2012-11-18 3 views
4

저는 gtkd 소스의 데모를 사용하여 gtk 프로그래밍 및 d와 학습에 익숙하지 않습니다. 아래의 코드를 컴파일하려고하면 [archlinux에서 dmd-2.060과 gtkd-2.0을 사용하고 있습니다].GtkD 소스 뷰 코드를 컴파일 할 수 없습니다.

/* 
    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 관련 코드 및 주석 텍스트 뷰 관련 코드를 언급 할 때 컴파일과 잘 실행됩니다.

참고 :이 코드는 sourceView gtkd demos 디렉토리의 SVTest.d 파일에 있습니다.

편집 : 나는 DMD 내가했던 지금 나에게 그 오류를 제공 한 컴파일을 SVTest.d하고 있었다 은 -L-lgtkd -L-lgtkdsv이을 SVTest.d -L-LDL은 그것은 컴파일 된 DMD 벌금. 이제 pragma 문을 제거하고 컴파일러 플래그로 컴파일하려고하면 실패합니다. 나는 여기에서 약간 혼란 스럽다. D doc는 pragma가 컴파일러에게 정보를 전달하기위한 것이라고 말했다. 소스 코드를 컴파일하는 데 pragma 및 컴파일러 플래그가 모두 필요합니까? 아니면 내가 뭔가 잘못하고있는거야?

업데이트는 : 실제로 프라 그마 순서는 내가 원래 싶고 된 지금은 단지

dmd main.d 

을 할 수있는 나는이

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

에 프라그를 변경, 중요.

+0

컴파일 할 때 무엇을 사용하고 있습니까? 링커가 필요한 모듈을 찾을 수없는 것 같습니다. 플래그에 그들을 포함 시키시겠습니까? – scry

답변

1

나는 링커의 순서가 중요하다고 생각한다. gtkd는 공유 객체를로드하므로 libdl이 필요하므로 -l-Ldl이 목록의 첫 번째에 있어야합니다. (터미널에서 수행 한 작업)

pragma (lib, "dl"); 첫 번째 지점으로 이동하여 차이가 있는지 확인합니다.