2012-06-07 5 views
0

Это отчасти связано с этим вопросом здесь: GtkD (the Gtk+bindings for the D language) why compile it?Использование GtkD в Linux, как мне статически связывать скомпилированную библиотеку?

Я использую GtkD с языком программирования D на Ubuntu 12.04 и я застрял, пытаясь статически скомпилированные с LIBS моей программы. После 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

Порядок вопросов аргументов с л.д., линкера. В общем, вы должны размещать зависимости после кода/библиотеки, который зависит от них. Так что я бы переписать ваши прагмами так:

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

Это работает! 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

я получаю ту же ошибку, используя этот метод. –