直接从C ++调用D函数

时间:2014-11-14 06:08:58

标签: c++ interop d

我经历了http://dlang.org/cpp_interface.html,在所有的例子中,即使是那些C ++代码调用某些D代码的代码,主函数也存在于D中(因此调用的二进制文件是从D源文件)。文档中的“从C ++调用D”示例中有一个在D中定义的函数foo,它从C ++中的函数栏调用,而bar又从D中的main函数调用。

是否可以从C ++函数调用D代码?我正在尝试做一些简单的事情,如下所示,但不断出现构建错误:

在D:

import std.stdio;

extern (C++) void CallFromCPlusPlusTest() {
  writeln("You can call me from C++");
}

然后在C ++中:

#include <iostream>

using namespace std;

void CallFromCPlusPlusTest();

int main() {
  cout << "hello world"<<"\n";
  CallFromCPlusPlusTest();
}

1 个答案:

答案 0 :(得分:7)

是的,有可能,(您的里程可能因使用的C ++编译器而异。)

首先,您必须从C ++或D端初始化D运行时。

cpptestd.d:

import std.stdio;

extern (C++) void CallFromCPlusPlusTest() {
  /*
   * Druntime could also be initialized from the D function:
  import core.runtime;
  Runtime.initialize();
  */
  writeln("You can call me from C++");
  //Runtime.terminate(); // and terminated
}

编译: dmd -c cpptestd.d

cpptest.cpp:

#include <iostream>

using namespace std;

void CallFromCPlusPlusTest();
extern "C" int rt_init();
extern "C" int rt_term();

int main() {
  cout << "hello world"<<"\n";
  rt_init(); // initialize druntime from C++
  CallFromCPlusPlusTest();
  rt_term(); // terminate druntime from C++
  return 0;
}

编译并链接: g ++ cpptest.cpp cpptestd.o -L / path / to / phobos / -lphobos2 -pthread

这适用于Linux。