2010-09-04 12 views
6

Realmente me gustaría obtener más en D, pero la falta de un buen soporte de biblioteca realmente me está obstaculizando. Por lo tanto, me gustaría crear algunos enlaces D para bibliotecas C existentes que me gustaría usar. Nunca he hecho ningún enlace, pero tampoco parece demasiado difícil.Escribiendo un enlace D (D2) para bibliotecas C existentes

Estoy planeando hacer esto para D2 (no específicamente D1, pero si podría ser para ambos, incluso mejor). Estoy usando el compilador DMD2.

  • ¿Qué convenciones deben usarse (noté declaraciones de versión, alias y constantes regulares/definiciones de funciones)?
  • ¿Cuál sería la diferencia entre el enlace a una biblioteca estática (y por lo tanto vinculada) o una biblioteca dinámica? ¿Hay alguna diferencia en el enlace?
  • Para enlazar una biblioteca estática, el compilador DMD no parece aceptar archivos .a o .o, solo .lib y .obj. ¿Esto significa que las bibliotecas deben compilarse con el compilador de DMC (a diferencia del compilador de GCC) y luego vincularse a través del compilador de DMD?

Si alguien tenía un muy corto ejemplo de cómo se lograría una unión, sería una gran lleno. Actualmente puedo compilar código C con DMC, vincular los archivos objeto y ejecutar funciones desde el código C en D. Sin embargo, la mayoría de las bibliotecas C solo necesitan una inclusión de archivo de cabecera Y deben vincularse en C. No estoy seguro de cómo hacer enlaces que funcionan para eso ...

¡Gracias!

+0

Windows? ______ – kennytm

+0

Sí, Windows (x86). Aunque mi objetivo es hacer que las cosas sean portátiles, de ser posible ... –

+0

Por curiosidad, ¿a qué bibliotecas te diriges? –

Respuesta

4

Un par de cosas a tener en cuenta:

  1. DMD y su enlazador trabajo Optlink con el formato de archivo de objeto OMF mayores, no COFF. Esto significa que los archivos C con los que se vincula deben ser también OMF. Si no desea usar DMC, hay herramientas que convertirán COFF en OMF, aunque no conozco los detalles sobre ellas.

  2. En lo que se refiere a la traducción de archivos .h a archivos .d, una utilidad llamada htod se empaqueta con DMD, y hará esta traducción por usted, aunque de forma un tanto imperfecta si usted maltrata severamente el preprocesador. En general, utiliza const, immutable o enum para constantes de manifiesto, version declaraciones para compilación condicional y funciones regulares (posiblemente con plantilla) para macro funciones.

En cuanto a ejemplos, un lugar para buscar sería en druntime, which contains bindings for the entire C standard library.

+0

Gracias. Creo que la interfaz es bastante clara para mí ahora. Entonces, ¿una forma sería hacer un proyecto que consista en los archivos de interfaz y los archivos de objetos OMF de C y luego compilarlos en un archivo .lib? El archivo .lib se vinculará a, y los archivos de interfaz se 'importan'. Sin embargo, sería difícil distribuirlo (¿la recompilación para la mayoría de los usuarios?), Pero es bastante fácil de usar. –

+0

druntime movido a github, [nuevo enlace] (https://github.com/D-Programming-Language/druntime/tree/master/src/core/stdc). También IIUC, hay [proyecto consolidado de consolidaciones de C para D] (https://github.com/D-Programming-Language/deimos) ahora –

+0

Algunos [consejos sobre el sitio externo] (http://www.dpl.org /htomodule.html) –

1

Usted puede echar un vistazo a cómo Aldacron hace con Derelict2.

Cuestiones relacionadas