2009-10-27 10 views
17

Aujourd'hui, j'ai entendu parler de la programmation D et de sa compatibilité avec le code C. Néanmoins, je n'ai trouvé aucune information sur s'il est possible d'utiliser des bibliothèques C comme GTK ou PortAudio de D? Si c'est possible, pourriez-vous expliquer comment faire cela?Comment utiliser une bibliothèque C à partir de D?

Répondre

18

Il est possible d'appeler des bibliothèques C à partir de D. Ce que vous devez faire est de convertir les fichiers d'en-tête C en D. Pour la plupart, c'est assez simple, et il est difficile d'utiliser command-line tool automatiser le processus. Cela n'a jamais vraiment fonctionné pour moi que sur des exemples de jouets, mais cela pourrait être un bon début pour voir le genre de transformations qui doivent être faites. Il suffit de mettre un extrait que vous avez du mal à traduire en en-tête et de voir ce que fait htod avec.

Le plus gros problème que vous rencontrerez habituellement est l'utilisation créative du préprocesseur C. Certaines choses peuvent être transformées en instructions version() dans D, mais pas toutes. En ce qui concerne la compilation et la liaison avec le code, sur les plateformes de type unix, je pense que vous pouvez compiler et lier dans le code C en utilisant GCC. Sous Windows, vous devez compiler les fichiers C à l'aide de DMC et les lier à DMD. Ou vous pouvez compiler le code C dans une DLL en utilisant n'importe quel compilateur capable de cela, et ensuite pour lier avec DMD vous devez faire une bibliothèque d'importation compatible DMD hors de la DLL. Cela peut être fait en utilisant l'outil implib trouvé dans le Basic Utilities Package gratuit disponible auprès de DigitalMars.

De nombreuses traductions d'en-tête ont déjà été effectuées. Il est utile de parcourir d'abord le projet Bindings de Dsource, ou de demander d'abord aux groupes de discussion digitalmars D avant de se lancer dans quelque chose d'aussi important que la traduction des en-têtes GTK. Beaucoup de bibliothèques populaires comme GTK ont déjà été enveloppé (par exemple ici: GTKD)

4

Le code D peut être lié à des fichiers objet C et peut interagir avec des DLLs C, mais vous devrez générer un module D à partir du fichier d'en-tête C que vous souhaitez utiliser. Le site officiel D a a guide pour faire cela même chose.

4

Une alternative populaire consiste à charger la bibliothèque pendant l'exécution. Voici un exemple comment charger libpng et appeler une fonction 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 

Utilisez le DPaste pour le tester: http://www.dpaste.dzfl.pl/917bc3fb

Questions connexes