2012-04-08 14 views
8

¿Cómo llamar a la función C++ desde el programa D? Todavía no puedo entender cómo hacerlo. ¿Qué comandos necesito ejecutar? Uso dmd en Fedora.Llamar C++ (C) desde el lenguaje D

+2

Intenta mirar http://dlang.org/interfaceToC.html, aunque parece que solo funciona con C. Aquí puedes ver las propuestas sobre cómo interactuar con C++: http://dlang.org/cpp_interface. html –

+0

Miré ese tutorial. Falló la descripción del archivo .di. Gracias por Vlad quien comparte conmigo la solución. – Stan

Respuesta

14

ejemplo más simple que puedo pensar, si hace una llamada a funciones C:

$ cat a.c 
int f(int a, int b){ 
    return a + b + 42; 
} 
$ cat a.di 
extern (C): 
int f(int, int); 
$ cat b.d 
import std.stdio; 
import a; 
void main(){ 
    writeln(f(100, 1000)); 
} 
$ gcc -c a.c 
$ dmd b.d a.o 
$ ./b 
1142 
$ 

Si estás usando objetos compartidos, que podía así que algo como:

$ cat sdltest.di 
module sdltest; 

extern (C): 

struct SDL_version{ 
    ubyte major; 
    ubyte minor; 
    ubyte patch; 
} 

SDL_version * SDL_Linked_Version(); 

$ cat a.d 
import std.stdio; 
import sdltest; 

void main(){ 
    SDL_version *ver = SDL_Linked_Version(); 
    writefln("%d.%d.%d", ver.major, ver.minor, ver.patch); 
} 

$ dmd a.d -L-lSDL 
$ ./a 
1.2.14 
$ 

En este ejemplo , He vinculado con una función SDL. El argumento -L a dmd le permite pasar argumentos al ld, en este caso -lSDL para vincular con SDL.

Los archivos de la interfaz D (.di) se describen here.

También debería echar un vistazo a htod.

+0

¡Eso es genial! Muchas gracias. Funciona. ¿Qué es el archivo .di? No he leído sobre esto antes. – Stan

+0

Entonces, por ejemplo, para usar libxml necesito escribir enlaces para las funciones que voy a usar, ¿verdad? – Stan

+1

@StanislavFeldman: Creo que sí, a menos que alguien lo haya hecho antes. Algunas bibliotecas populares ya tienen enlaces D. ¿Necesitas específicamente libxml? D tiene un módulo ['std.xml'] (http://dlang.org/phobos/std_xml.html). También agregué un ejemplo de compilación con bibliotecas compartidas. – Vlad