Estoy tratando de iniciar rápidamente con bibliotecas compartidas dinámicas en D, pero tengo un problema.d2: Llamando a writefln en D bibliotecas compartidas desde el lado C
estoy construyendo siguiente código con dmd -shared ./testlib.d
:
module testlib;
import std.c.stdio;
extern (C) export int hello(int a) {
printf("Number is %d", a);
return (a + 1);
}
Se construye muy bien, y trabaja. Pero cuando estoy tratando de hacer uso de la siguiente fuente más ish D':
module testlib;
import std.stdio;
extern (C) export int hello(int a) {
writefln("Number is %d", a);
return (a + 1);
}
Se falla con un error de segmentación una vez que estoy tratando de llamar hello
. ¿Qué estoy haciendo mal?
estoy llamando hello
usando Python:
import ctypes
testlib = ctypes.CDLL('testlib.dylib');
print (testlib.hello(10))
UPD1: Parece que tampoco puedo utilizar funciones como Phobos std.conv.to!(string)
.
UPD2: No hay tal problema en Windows, todo parece funcionar bien. Mac OS X sufre de esto.
UPD3: Posiblemente, esto está conectado con GC. De alguna manera debo inicializar GC, pero core.memory.GC.enable() aún falla con falla de segmentación.
Tal vez, use RAII en su lugar? entonces, cree una nueva clase 'DRuntime' y agregue su función' init' al constructor, 'done' - al destructor. Entonces, el cliente simplemente crea un objeto de esta clase, y hace todo el trabajo para nosotros. – Raxillan
¿Pero qué debo hacer si el cliente no está escrito en D? P.ej. ¿Cómo puede C core instanciar DRuntime descendiente? – toriningen
Si necesita explícitamente C, lo que no tienen soporte C++ 'clase',' nuevo', constructores/destructores, simplemente use sus funciones 'init/done' en el estilo C habitual. Y puede ver http://dlang.org/cpp_interface.html, si aún no. – Raxillan