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