Appeler une fonction D directement à partir de C ++

J’ai consulté http://dlang.org/cpp_interface.html et, dans tous les exemples, même ceux où du code C ++ appelle du code D, la fonction principale réside en D (le binary appelé est donc celui compilé à partir du fichier source D). L’exemple “appelant D de C ++” dans le document a une fonction foo définie dans D, qui est appelée à partir d’une barre de fonction en C ++, et bar est à son tour appelée à partir de la fonction principale dans D.

Est-il possible d’appeler simplement du code D à partir de la fonction C ++? J’essaie de faire quelque chose de simple comme celui-ci, mais je continue à avoir des erreurs de construction:

En D:

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

Puis en C ++:

 #include  using namespace std; void CallFromCPlusPlusTest(); int main() { cout << "hello world"<<"\n"; CallFromCPlusPlusTest(); } 

Oui, c’est possible (votre kilométrage peut varier en fonction du compilateur C ++ utilisé.)

Tout d’abord, vous devrez initialiser le moteur d’exécution D, du côté C ++ ou du côté 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 } 

Comstackr avec: dmd -c cpptestd.d

cpptest.cpp:

 #include  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; } 

Comstackr et créer un lien avec: g ++ cpptest.cpp cpptestd.o -L / chemin / vers / phobos / -lphobos2 -pthread

Cela fonctionne pour moi sur Linux.