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()仍然會因分段錯誤而失敗。
也許,使用RAII呢?因此,創建新類'DRuntime'並添加'init'函數的構造,'done' - 以析構函數。所以,客戶只需創建這個類的對象 - 它爲我們創造了所有的工作。 – Raxillan 2012-03-18 16:06:07
但我應該怎麼做,如果客戶沒有在d寫的?例如。 C內核如何實例化DRuntime後代? – toriningen 2012-03-18 16:56:49
如果你需要明確C,什麼都沒有C++'class','new',構造函數/析構函數的支持 - 只需使用你的'初始化/ done'功能在通常的C風格。你可以看看http://dlang.org/cpp_interface.html,如果還沒有。 – Raxillan 2012-03-18 18:04:25