2009-10-27 19 views
17

Dzisiaj usłyszałem o programowaniu D i że jest kompatybilny z C-Code. Niemniej jednak nie znalazłem żadnych informacji o tym, czy możliwe jest korzystanie z bibliotek C, takich jak GTK czy PortAudio z D? Jeśli to możliwe, czy możesz wyjaśnić, jak to zrobić?Jak korzystać z biblioteki C z D?

Odpowiedz

18

Możliwe jest wywoływanie bibliotek C z D. To, co musisz zrobić, to przekonwertować pliki nagłówkowe C na D. W większości przypadków jest to całkiem proste, a trudno jest użyć command-line tool, aby pomóc zautomatyzować proces. To nigdy nie działało dla mnie na niczym innym, jak tylko przykładach zabawek, ale może to być dobry początek, aby zobaczyć rodzaj transformacji, które należy wykonać. Wystarczy, że wstawisz fragment kodu, który sam utrudnisz w tłumaczeniu i zobaczysz, co robi z nim htod.

Największy problem, na który napotykasz, to kreatywne użycie preprocesora C. Niektóre rzeczy można przekształcić w instrukcje version() w D, ale nie wszystkie.

Co do rzeczywistej kompilacji i łączenia z kodem, na platformach uniksowych Myślę, że możesz skompilować i połączyć kod C używając GCC. W systemie Windows trzeba skompilować pliki C za pomocą DMC i połączyć z DMD. Lub możesz skompilować kod C do biblioteki DLL za pomocą dowolnego kompilatora, który jest w stanie to zrobić, a następnie połączyć się z DMD, aby utworzyć bibliotekę importu zgodną z DMD z biblioteki DLL. Można to zrobić za pomocą narzędzia implib dostępnego w darmowym oprogramowaniu DigitalMars.

Istnieje również wiele tych tłumaczeń nagłówkowych już wykonanych. Warto najpierw przejrzeć projekt Dsource w wersji Bindings lub najpierw zadać pytanie grupom cyfrowym D, zanim rozpocznie się coś dużego jak tłumaczenie nagłówków GTK. Wiele popularnych bibliotek takich jak GTK zostały opakowane (np tutaj: GTKD)

4

Kod D może być powiązany z plikami obiektów C i może wchodzić w interakcje z bibliotekami Dll C, ale będziesz musiał wygenerować moduł D z pliku nagłówkowego C, którego chcesz użyć. Oficjalna strona D ma a guide za zrobienie tego właśnie.

4

Popularną alternatywą jest ładowanie biblioteki podczas uruchamiania. Oto przykład, jak załadować libpng i wywołać funkcję libpng:

module libpngtest; 

import std.stdio; 
import core.sys.posix.dlfcn; 

alias uint function() png_access_version_number_t; 

int main() { 
    auto lib = dlopen("libpng.so".ptr, RTLD_LAZY | RTLD_LOCAL); 
    if (lib is null) { 
    writeln("EEEK!"); 
    writeln(to!string(dlerror())); 
    return -1; 
    } else { 
    writeln("WOOT!"); 
    auto png_access_version_number = cast(png_access_version_number_t)dlsym(lib, "png_access_version_number"); 
    writeln(png_access_version_number()); 
    } 

    if (dlclose(lib) == 0) { 
    return 0; 
    } else { 
    return -1; 
    } 
} // main() function 

// compile: dmd libpngtest.d -L-ldl 
// run:  ./libpngtest 

użyć DPaste go przetestować: http://www.dpaste.dzfl.pl/917bc3fb

Powiązane problemy