2012-03-18 39 views
6

在d共享库调用writefln我试图与d动态共享库到快速开始,但我有一个问题。D2:从C侧

我建立以下代码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。我究竟做错了什么?

我使用Python调用hello

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()仍然会因分段错误而失败。

回答

5

解决方法很简单,但辉煌:

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的方式来自动地调用这些函数,但我很满意,即使是这样。

+1

也许,使用RAII呢?因此,创建新类'DRuntime'并添加'init'函数的构造,'done' - 以析构函数。所以,客户只需创建这个类的对象 - 它为我们创造了所有的工作。 – Raxillan 2012-03-18 16:06:07

+0

但我应该怎么做,如果客户没有在d写的?例如。 C内核如何实例化DRuntime后代? – toriningen 2012-03-18 16:56:49

+0

如果你需要明确C,什么都没有C++'class','new',构造函数/析构函数的支持 - 只需使用你的'初始化/ done'功能在通常的C风格。你可以看看http://dlang.org/cpp_interface.html,如果还没有。 – Raxillan 2012-03-18 18:04:25