2016-05-08 3 views
5

J'essaie de créer une structure de données qui sera exposée dans Haskell, mais implémentée en C++. Jusqu'à présent, je l'ai mis en œuvre dans un fichier .cpp, a déclaré toutes les fonctions dont j'ai besoin extern "C" et ajouté le fichier source au champ c-sources dans le fichier .cabal. Quand je construis le projet (dans ce cas avec stack build) il semble construire bien.Inclure des sources C++ dans un projet Haskell

Je sais qu'il fait quelque chose au fichier C++ car il ne compile pas s'il y a des erreurs.

Je n'ai pas encore essayé d'exécuter le projet car c'est une bibliothèque et pour l'instant il n'y a rien de "runnable" écrit, mais le repl semble ne pas fonctionner. Lorsque j'essaie de l'exécuter (stack repl dans ce cas), je reçois une erreur de symbole manquante avec un nom mutilé qui peut ou non se référer à un nom dans mon fichier.

unknown symbol `_ZdlPv' 
linking extra libraries/objects failed 

Comment puis-je résoudre ce problème? J'ai déjà eu un problème similaire que j'ai résolu en compilant manuellement la source dans une bibliothèque dynamique et ensuite utiliser cette bibliothèque dans mon projet. Je ne veux pas faire cela car cela me lie à une plate-forme et cela n'a aucun sens qu'un simple C++ ne puisse pas être compilé avec le projet en utilisant les outils que GHC possède déjà. Je veux être en mesure de mettre cela sur le hackage.

Y a-t-il quelque chose qui me manque? Si non, est-ce un bug et y a-t-il des plans pour le réparer?

+0

Veuillez ajouter le message d'erreur exact et un [mcve]. – Zeta

+2

Voici un exemple pour un paquet cabal qui contient des sources C++ https://github.com/jbransen/minisat-bundle/blob/master/minisat.cabal – d8d0d65b3f7cf42

+0

@Zeta Ce n'est pas ce type de question. –

Répondre

2

Ok, j'ai réussi à "réparer" cela pour le moment.

J'ai ajouté un extra-libraries: stdc++-6, gcc_s_seh-1 à mon fichier cabal et maintenant cela fonctionne. Aucune idée si c'est indépendant de la plate-forme, mais ces bibliothèques sont expédiées avec GHC lorsque je l'installe via la pile.