Domanda

Oggi ho sentito parlare della programmazione D e che è compatibile con il codice C. Tuttavia non ho trovato alcuna informazione sul fatto che sia possibile utilizzare librerie C come GTK o PortAudio da D? Se è possibile, potresti spiegare come farlo?

È stato utile?

Soluzione

È possibile chiamare le librerie C da D. Quello che devi fare è convertire i file di intestazione C in D. Per la maggior parte questo è abbastanza semplice, e c'è un strumento da riga di comando per automatizzare il processo. Non ha mai funzionato davvero per me, tranne che per esempi di giocattoli, ma potrebbe essere un buon inizio per vedere il tipo di trasformazioni che devono essere fatte. Basta inserire uno snippet che stai riscontrando problemi a tradurre in un'intestazione da solo e vedere cosa ne fa Htod.

Il problema più grande che si incontra di solito è l'uso creativo del preprocessore C. Alcune cose possono essere trasformate in istruzioni version () in D, ma non tutte.

Per quanto riguarda effettivamente la compilazione e il collegamento con il codice, su piattaforme unix-like penso che tu possa compilare e collegare il codice C usando GCC. Su Windows devi compilare i file C usando DMC e collegarti a DMD. Oppure puoi compilare il codice C in una DLL usando qualsiasi compilatore in grado di farlo, e quindi per collegarti a DMD devi creare una lib di importazione compatibile con DMD dalla DLL. Questo può essere fatto utilizzando lo strumento Implib disponibile nel pacchetto di utilità di base gratuito disponibile da DigitalMars.

Ci sono anche molte di queste traduzioni di intestazione già fatte. È utile sfogliare il Bindings progetto di Dsource o chiedere prima ai newsgroup di digitalmars D prima di intraprendere qualcosa grande come tradurre le intestazioni GTK. Molte librerie popolari come GTK sono già state completate (ad esempio qui: GTKD )

Altri suggerimenti

Il codice D può essere collegato con i file oggetto C e può interagire con le DLL C, ma è necessario generare un modulo D dal file di intestazione C che si desidera utilizzare. Il sito web ufficiale di D ha una guida per fare proprio questo.

L'alternativa popolare è caricare la libreria durante il runtime. Ecco un esempio di come caricare libpng e chiamare una funzione 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

Usa DPaste per testarlo: http://www.dpaste.dzfl.pl/917bc3fb

Devi scrivere i collegamenti C. Questa risposta spiega come.

Dai un'occhiata a http://dsource.org Esistono molti progetti che potrebbero aiutarti a iniziare

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top