2012-03-18 38 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