2012-06-07 99 views
0

這是一種鏈接到這個問題在這裏:GtkD (the Gtk+bindings for the D language) why compile it?在Linux上使用GtkD,我如何靜態鏈接編譯的庫?

我使用GtkD在Ubuntu 12.04的d的編程語言,我被卡住試圖靜態與我聯繫的程序編譯庫。一旦GtkD編譯有三個庫

  1. libgtkd.a
  2. libgtkdgl.a
  3. libgtkdsv.a

make install這些之後放入/usr/local/lib/文件夾和GtkD源放置在/usr/local/includes/d/文件夾內。我還將源代碼編譯爲*.di文件,並將它們放在/usr/local/includes/d/的相關文件夾中,因爲make腳本默認不會這樣做。

這是我想要編譯的源代碼。

pragma(lib, "/usr/local/lib/libgtkd.a"); 

import gtk.MainWindow; 
import gtk.Label; 
import gtk.Main; 

void main(string[] args) 
{ 
    Main.init(args); 
    MainWindow win = new MainWindow("Hello World!"); 
    win.setDefaultSize(200, 100); 
    win.add(new Label("Hello World")); 
    win.showAll(); 
    Main.run(); 
} 

這裏的編譯器命令我使用:

rdmd -L-ldl hello_world.d 

這裏的錯誤:

/usr/local/lib/libgtkd.a(Loader.o): In function `_D4gtkc6Loader12pLoadLibraryFAyaE4gtkc6Loader4RTLDZPv': 
src/gtkc/Loader.d:(.text._D4gtkc6Loader12pLoadLibraryFAyaE4gtkc6Loader4RTLDZPv+0x28): undefined reference to `dlopen' 
src/gtkc/Loader.d:(.text._D4gtkc6Loader12pLoadLibraryFAyaE4gtkc6Loader4RTLDZPv+0x31): undefined reference to `dlerror' 
/usr/local/lib/libgtkd.a(Loader.o): In function `_D4gtkc6Loader10pGetSymbolFPvAyaZPv': 
src/gtkc/Loader.d:(.text._D4gtkc6Loader10pGetSymbolFPvAyaZPv+0x23): undefined reference to `dlsym' 
src/gtkc/Loader.d:(.text._D4gtkc6Loader10pGetSymbolFPvAyaZPv+0x2c): undefined reference to `dlerror' 
/usr/local/lib/libgtkd.a(Loader.o): In function `_D4gtkc6Loader14pUnloadLibraryFPvZi': 
src/gtkc/Loader.d:(.text._D4gtkc6Loader14pUnloadLibraryFPvZi+0x9): undefined reference to `dlclose' 
collect2: ld returned 1 exit status 
--- errorlevel 1 

shell returned 1 

任何想法我做錯了嗎?它看起來像一個LD錯誤,但這是正確的?

回答

3

的參數中的順序與LD,鏈接器。一般來說,你應該在之後放置依賴關係依賴於它們的代碼/庫。所以我重寫你的編譯指示像這樣:

pragma(lib, "gtkd"); // let ld find it in your path 
pragma(lib, "dl"); // gtkd depends on dl, so link it after 

現在嘗試編譯:

dmd hello_world.d 
+0

This Works! RAWR !!!!!乾杯!!!這已經讓我纏繞了好幾天! –

+0

雖然有一個問題,字符串'gtkd'如何引用文件'libgtkd.a'? –

+2

系統上的鏈接器知道是否需要翻譯它。在Linux上,它預先放置一個「lib」並附加一個「.so」。在Windows上,它會做適當的事情,無論如何。所以最好不要讓你的鏈接系統特定。 –

0

你通過它沿參數DMD知道,他們需要被傳遞給鏈接

rdmd libgtkd.a libgtkdgl.a libgtkdsv.a -L-ldl hello_world.d 
+0

我用這個方法得到同樣的錯誤。 –