Edit: Vous devriez également voir de Tomer réponse ci-dessous. Ma réponse ici décrit la théorie de ce qui se passe, mais j'ai peut-être quelques-uns des détails de l'exécution incomplète, alors que sa réponse est un exemple de travail.
Comme sclv l'indique, la compilation devrait y avoir aucun problème. La difficulté qu'il y a probablement un lien vers le code C++, et ici, vous aurez un peu de difficulté avec l'obtention de toutes les bibliothèques d'exécution liée. Le problème est que Haskell programmes doivent être liés avec le Haskell bibliothèques d'exécution, et les programmes C++ doivent être liés avec le C++ runtime des bibliothèques. Dans la page Wiki que vous référence, quand ils ne
$ ghc -optc -O test.c A.o A_stub.o -o test
pour compiler le programme en C, qui ne fait en deux étapes: Il compile le programme C dans un fichier objet, puis des liens ensemble. Écrit, qui serait quelque chose comme (probablement pas tout à fait le droit, car je ne parle pas de GHC):
$ ghc -c -optc-O test.c -o test.o
$ ghc test.o A.o A_stub.o -o test
GHC seulement des actes comme GCC (et, IIUC, fonctionnellement est GCC) lors de la compilation du programme C. Lors de la liaison, cependant, il est différent de ce qui se passe si vous appeler GCC directement, car elle aussi comme par magie comprend le Haskell bibliothèques d'exécution. G++ fonctionne de la même manière pour les programmes C++ -- quand il est utilisé comme un éditeur de liens, il comprend le C++ runtime des bibliothèques.
Donc, comme je l'ai mentionné, vous avez besoin de compiler de façon que les liens avec les deux bibliothèques. Si vous exécutez G++ en mode verbose pour compiler et lier un programme, comme suit:
$ g++ test.cpp -o test -v
il permettra de créer une longue liste de sortie sur ce qu'il fait; à la fin sera une ligne de sortie où il fait la liaison (avec l' collect2
sous-programme), indiquant que les bibliothèques des liens vers elle. Vous pouvez comparer cela à la sortie de la compilation d'un simple programme en C pour voir ce qui est différent de C++; sur mon système, il ajoute -lstdc++
.
Donc, vous devriez être en mesure de compiler et lier votre mélange Haskell/C++ programme comme suit:
$ ghc -c -XForeignFunctionInterface -O A.hs # compile Haskell object file.
$ g++ -c -O test.cpp # compile C++ object file.
$ ghc A.o A_stub.o test.o -lstdc++ -o test # link
Il y a, parce que vous avez spécifié -lstdc++
, il inclut le C++ runtime library (en supposant -l
est le droit de GHC syntaxe; vous aurez besoin de vérifier), et parce que vous avez lié avec ghc
, il comprendra le Haskell bibliothèque d'exécution. Il devrait en résulter un programme de travail.
Alternativement, vous devriez être en mesure de faire quelque chose de similaire à l' -v
sortie d'enquête GHC, et de comprendre ce Haskell bibliothèque d'exécution (ou bibliothèques), des liens vers elle pour Haskell, le soutien, et puis les ajouter à la bibliothèque lors de la liaison de votre programme C++, tout comme vous le faites déjà pour pure programmes C++. (Voir Tomer réponse pour les détails, puisque c'est ce qu'il a fait.)