Question

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 la possibilité d'utiliser des bibliothèques C telles que GTK ou PortAudio de D? Si cela est possible, pourriez-vous expliquer comment procéder?

Était-ce utile?

La solution

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. La plupart du temps, c’est assez simple, et il y a un logiciel difficile à utiliser outil de ligne de commande pour aider à automatiser le processus. Cela n'a jamais vraiment fonctionné pour moi sur autre chose que des exemples de jouets, mais cela pourrait être un bon début pour voir le type de transformation à effectuer. Il suffit de mettre un extrait que vous avez du mal à traduire en en-tête et de voir ce que htod en fait.

Le plus gros problème que vous rencontrerez généralement est l'utilisation créative du préprocesseur C. Certaines choses peuvent être transformées en instructions version () en D, mais pas toutes.

En ce qui concerne la compilation et la liaison avec le code, sur les plates-formes de type Unix, je pense que vous pouvez compiler et lier dans le code C en utilisant GCC. Sous Windows, vous devez soit compiler les fichiers C à l'aide de DMC et établir une liaison avec DMD. Ou vous pouvez compiler le code C dans une DLL en utilisant n’importe quel compilateur capable de le faire, puis pour établir une liaison avec DMD, vous devez créer une bibliothèque d’importation compatible DMD à partir de la DLL. Cela peut être fait à l'aide de l'outil implib figurant dans le package d'utilitaires de base gratuit disponible à DigitalMars.

Il y a aussi beaucoup de traductions de cet en-tête qui ont déjà été faites. Il est utile de parcourir d'abord le projet Bindings de Dsource, ou de poser d'abord sur les groupes de discussion digitalmars D avant de se lancer. gros comme la traduction des en-têtes GTK. De nombreuses bibliothèques populaires telles que GTK ont déjà été encapsulées (par exemple, ici: GTKD )

.

Autres conseils

Le code D peut être lié à des fichiers d'objet C et peut interagir avec des dll C, mais vous devez générer un module D à partir du fichier d'en-tête C que vous souhaitez utiliser. Le site Web officiel de D dispose de un guide pour ce faire.

L'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

Vous devez écrire des liaisons en C. Cette réponse explique comment.

Consultez http://dsource.org . Il existe de nombreux projets qui pourraient vous aider à démarrer avec

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top