2009-10-27 21 views
17

Hoy escuché sobre la programación D y que es compatible con el código C. Sin embargo, no he encontrado ninguna información sobre si es posible usar bibliotecas C como GTK o PortAudio desde D? Si es posible, ¿podría explicarme cómo hacer esto?¿Cómo usar una biblioteca C de D?

Respuesta

18

Es posible llamar a las bibliotecas C desde D. Lo que necesita hacer es convertir los archivos de encabezado C a D. En su mayor parte esto es bastante sencillo, y hay un command-line tool difícil de usar para ayudar automatizar el proceso En realidad, nunca funcionó para mí en nada más que ejemplos de juguetes, pero podría ser un buen comienzo para ver el tipo de transformaciones que se deben hacer. Simplemente ponga un fragmento que tenga problemas para traducir en un encabezado por sí mismo y vea qué htod hace con él.

El mayor problema que generalmente encontrará es el uso creativo del preprocesador C. Algunas cosas se pueden convertir en versiones() en D, pero no todas.

En cuanto a la compilación y vinculación con el código, en plataformas unix creo que puede compilar y vincular en el código C usando GCC. En Windows, debe compilar los archivos C con DMC y vincular con DMD. O puede compilar el código C en una DLL usando cualquier compilador capaz de eso, y luego para enlazar con DMD necesita hacer una lib libre de importación compatible con DMD de la DLL. Esto se puede hacer utilizando la herramienta implib que se encuentra en el número gratuito Basic Utilities Package disponible en DigitalMars.

También hay muchas de estas traducciones de encabezado que ya se han hecho. En primer lugar, es útil navegar por el proyecto Bindings de Dsource o preguntar en los grupos de noticias D de digitalmars antes de embarcarse en algo grande como traducir encabezados GTK. Una gran cantidad de bibliotecas populares como GTK ya han sido envuelto (por ejemplo aquí: GTKD)

4

El código D se puede vincular con los archivos del objeto C y puede interactuar con las DLL, pero deberá generar un módulo D a partir del archivo del encabezado C que desee utilizar. El sitio web oficial D tiene a guide por hacer eso mismo.

4

Alternativa popular es cargar la biblioteca durante el tiempo de ejecución. Aquí hay un ejemplo de cómo cargar libpng y llamar a una función 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 

Usar la DPaste para probarlo: http://www.dpaste.dzfl.pl/917bc3fb

Cuestiones relacionadas