publica - ¿Cómo usar una biblioteca C de D?
chicago public library hours (5)
Hoy escuché sobre la programación en D y que es compatible con el código C. Sin embargo, no he encontrado ninguna información sobre si es posible usar bibliotecas de C como GTK o PortAudio de D? Si es posible, ¿podría explicar cómo hacer esto?
Eche un vistazo a http://dsource.org. Hay muchos proyectos que pueden ayudarlo a comenzar
El código D puede vincularse con archivos objeto C y puede interactuar con archivos C dll, pero deberá generar un módulo D a partir del archivo de encabezado C que desea usar. El sitio web oficial de D tiene una guía para hacer eso mismo.
Es posible llamar a las bibliotecas de C desde D. Lo que debe hacer es convertir los archivos del encabezado de C a D. En su mayor parte, esto es bastante sencillo, y existe una herramienta de línea de comandos difícil de usar para ayudar a automatizar el proceso. Realmente nunca me ha funcionado en nada que no sean ejemplos de juguetes, pero podría ser un buen comienzo para ver el tipo de transformaciones que deben hacerse. Simplemente coloque un fragmento que tenga problemas para traducir en un encabezado por sí mismo y vea lo que htod hace con él.
El mayor problema con el que normalmente se encontrará es el uso creativo del preprocesador C. Algunas cosas se pueden convertir en declaraciones de versión () en D, pero no todas.
En cuanto a la compilación y la vinculación con el código, en plataformas similares a Unix creo que puede compilar y vincular el código C utilizando GCC. En Windows, o bien tiene que compilar los archivos C utilizando DMC y vincular con DMD. O puede compilar el código C en una DLL usando cualquier compilador capaz de eso, y luego para vincularlo con DMD necesita hacer una lib de importación compatible con DMD de la DLL. Esto se puede hacer usando la herramienta implib en el paquete gratuito de utilidades básicas disponible en DigitalMars.
También hay muchas de estas traducciones de encabezados que ya se han hecho. Es útil navegar primero en el proyecto Bindings de Dsource, o preguntar en los grupos de noticias de digitalmars D antes de embarcarse en algo grande como traducir encabezados GTK. Ya se han empaquetado muchas bibliotecas populares como GTK (por ejemplo, aquí: GTKD )
La 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
Utilice el DPaste para probarlo: http://www.dpaste.dzfl.pl/917bc3fb
Necesitas escribir enlaces en C. Esta respuesta explica cómo.