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.