2012-04-08 68 views
8

如何從D程序調用C++函數? 我還是不明白該怎麼做。 我需要執行哪些命令? 我在Fedora中使用dmd。從D語言調用C++(C)

+2

嘗試查看http://dlang.org/interfaceToC.html,儘管它似乎只能與C一起工作。您可以在這裏查看關於如何連接到C++的提議:http://dlang.org/cpp_interface。 html – 2012-04-08 12:26:52

+0

我看了那篇教程。它錯過了關於.di文件的描述。感謝Vlad與我共享解決方案。 – Stan 2012-04-08 14:26:32

回答

14

我能想到的,如果你調用C函數最簡單的例子:

$ cat a.c 
int f(int a, int b){ 
    return a + b + 42; 
} 
$ cat a.di 
extern (C): 
int f(int, int); 
$ cat b.d 
import std.stdio; 
import a; 
void main(){ 
    writeln(f(100, 1000)); 
} 
$ gcc -c a.c 
$ dmd b.d a.o 
$ ./b 
1142 
$ 

如果您使用的共享對象,你可以這樣類似:

$ cat sdltest.di 
module sdltest; 

extern (C): 

struct SDL_version{ 
    ubyte major; 
    ubyte minor; 
    ubyte patch; 
} 

SDL_version * SDL_Linked_Version(); 

$ cat a.d 
import std.stdio; 
import sdltest; 

void main(){ 
    SDL_version *ver = SDL_Linked_Version(); 
    writefln("%d.%d.%d", ver.major, ver.minor, ver.patch); 
} 

$ dmd a.d -L-lSDL 
$ ./a 
1.2.14 
$ 

在這個例子中,我用一個SDL函數鏈接。 -L參數爲dmd允許您將參數傳遞給ld,在這種情況下,請將-lSDL與SDL鏈接。

D接口文件(.di)被描述爲here

你也應該看看htod

+0

太棒了!非常感謝你。有用。什麼是.di文件?我以前沒有讀過它。 – Stan 2012-04-08 14:25:10

+0

因此,例如,使用libxml我需要爲我要使用的函數編寫綁定,對吧? – Stan 2012-04-08 14:30:33

+1

@StanislavFeldman:我認爲是這樣,除非有人以前做過。一些流行的庫已經有了D綁定。你特別需要libxml嗎? D有一個['std.xml'](http://dlang.org/phobos/std_xml.html)模塊。我還爲共享庫添加了一個編譯示例。 – Vlad 2012-04-08 15:30:22