43 votes

Création de bibliothèques partagées Haskell sous OS X

Je suis en train de créer une bibliothèque partagée à partir de Haskell code source.

J'ai essayé en suivant les instructions ici: http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/ mais je suis juste de ne pas avoir un peu de chance.

Quand je compile avec Haskell 64 bits (ghc 7.0.4 de 2011.4.0.0), je reçois le message d'erreur suivant:

ld: pointer in read-only segment not allowed in slidable image, used in 
                 ___gmpn_modexact_1c_odd 

Comme une alternative, j'ai aussi essayé la version 32 bits, et selon la nature exacte de drapeaux-je utiliser pour relier des erreurs telles que:

Library not loaded: /usr/local/lib/ghc-7.0.4/base-4.3.1.0/libHSbase-4.3.1.0-ghc7.0.4.dylib

J'ai réussi à obtenir un peu plus loin en ajoutant -lHSrts à l'éditeur de liens ligne. Cela m'a fait le point de réussir à lier et le chargement de la bibliothèque, mais je suis alors incapable de trouver le nom de la fonction à l'aide de dlsym (ou manuellement à l'aide nm | grep)

Tous les conseils seraient grandement appréciés, un exemple de fichier de créer, ou de créer une ligne qui a construit avec succès (et utilisé) une bibliothèque partagée sur OS X serait appréciée. Je suis assez nouveau à Haskell et ne sais pas si je devrais continuer à se taper la tête en supposant que le problème est sur ma fin, ou, pour diverses raisons que je ne devrais pas attendre que cela fonctionne sur OS X.

Un repo git avec toutes les combinaisons que j'ai essayé est disponible ici: https://github.com/bennoleslie/haskell-shared-example j'ai réussi à obtenir quelque chose qui marche pour les 32 bits de ghc, mais pas en 64 bits encore.

9voto

benno Points 934

Il est possible de créer de travail bibliothèques partagées sur 64-bit OS X, avec la dernière Haskell version de la Plateforme (2012.4 64bit)

L'invocation de la ligne fonctionne pour moi:

ghc -O2 --make \
-no-hs-main -optl '-shared' -optc '-DMODULE=Test' \
-o libTest.so Test.hs module_init.c

module_init.c doit être quelque chose comme:

#define CAT(a,b) XCAT(a,b)
#define XCAT(a,b) a ## b
#define STR(a) XSTR(a)
#define XSTR(a) #a

#include <HsFFI.h>

extern void CAT(__stginit_, MODULE)(void);

static void library_init(void) __attribute__((constructor));
static void library_init(void)
{
  /* This seems to be a no-op, but it makes the GHCRTS envvar work. */
  static char *argv[] = { STR(MODULE) ".so", 0 }, **argv_ = argv;
  static int argc = 1;

  hs_init(&argc, &argv_);
  hs_add_root(CAT(__stginit_, MODULE));
}

static void library_exit(void) __attribute__((destructor));
static void library_exit(void)
{
  hs_exit();
}

Ce repo git: https://github.com/bennoleslie/haskell-shared-example contient un exemple de travail.

Tout le crédit va à cette source d'origine: http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/

1voto

hd1 Points 11522

Vous voudrez peut-être essayer le port ghc dans Homebrew - https://github.com/mxcl/homebrew/blob/master/Library/Formula/ghc.rb

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X