d2: вызов writefln в разделяемых библиотеках D со стороны C - PullRequest
6 голосов
/ 18 марта 2012

Я пытаюсь быстро запустить динамические разделяемые библиотеки в D, но у меня возникла проблема.

Я строю следующий код с 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);
}

Он хорошо работает и работает.Но когда я пытаюсь использовать следующий источник D'ish:

module testlib;

import std.stdio;

extern (C) export int hello(int a) {
    writefln("Number is %d", a);

    return (a + 1);
}

Сбой при ошибке сегментации, когда я пытаюсь вызвать hello.Что я делаю не так?

Я звоню hello, используя Python:

import ctypes

testlib = ctypes.CDLL('testlib.dylib');

print (testlib.hello(10))

UPD1: Кажется, что я также не могу использовать такие функции Фобоса, как std.conv.to!(string).

UPD2: В Windows такой проблемы нет, кажется, все работает нормально.Mac OS X страдает от этого.

UPD3: Возможно, это связано с GC.Я должен каким-то образом инициализировать GC, но core.memory.GC.enable () все еще не работает с ошибкой сегментации.

1 Ответ

5 голосов
/ 18 марта 2012

Решение простое, но блестящее:

static import core.runtime;

extern (C) export void init() { // to be called once after loading shared lib
    core.runtime.Runtime.initialize();
}

extern (C) export void done() { // to be called before unloading shared lib
    core.runtime.Runtime.terminate();
}

Возможно, в Linux и Mac OS X есть способы автоматически вызывать эти функции, но я доволен даже этим.

...