2011-09-08 6 views
4

J'essaie de fournir aux utilisateurs de mon programme des binaires Linux en plus de ceux de Windows, donc j'ai installé Ubuntu 11.10 (depuis la plate-forme haskell) paquet sur 11.04 est toujours la version 2010). Quand j'essaye d'exécuter le binaire résultant sur Ubuntu 10.04, cependant, j'obtiens le message qu'il ne peut pas trouver libgmp.so.10. La vérification de/usr/lib révèle que 10.04 est livré avec libgmp.so.3 alors que 11.10 a libgmp.so.10. Il semblerait donc que GHC lie dynamiquement à libgmp plutôt qu'statiquement, ce que je pensais être le défaut.Le programme Haskell basé sur Ubuntu 11.10 ne fonctionne pas sous Ubuntu 10.04

Existe-t-il un moyen de dire à GHC d'inclure statiquement libgmp dans le binaire? Sinon, existe-t-il une autre solution qui n'exige pas que l'utilisateur installe une version différente de libgmp?

+0

Sauf erreur, la raison pour laquelle 'libgmp' est lié dynamiquement par défaut est que la liaison statique vous oblige à distribuer l'exécutable résultant sous licence GPL. – hammar

+0

Il serait mieux d'écrire un paquet et de faire construire chaque paquet pour chaque arc différent et pas de lien statique gmp – alternative

Répondre

2

Il s'avère que pour lier statiquement le binaire, le drapeau -static n'est pas suffisant. Au lieu de cela, utilisez:

ghc -static -optl-static -optl-pthread --make yourfile.hs 

En utilisant cela, mes binaires fonctionnaient correctement sur les deux versions d'Ubuntu.

+0

J'essaye de déployer mon application Web à la pile Heroku Cedar. Cedar utilise Ubuntu 11.04 et j'utilise 11.10. Donc, fondamentalement, j'ai eu la même erreur. Mais j'ai essayé votre solution et cela soulève une nouvelle erreur, 'mkTextEncoding: argument invalide (Invalid argument)'. Pouvez-vous m'aider ici? –

1

Souvent, les anciens paquets libgmp sont également disponibles; c'est-à-dire que votre programme dépend du paquet libgmp3c2 au lieu d'un libgmp générique ou libgmp10. Cela peut souvent être réalisé en compilant avec une version antérieure de GHC ou de la bibliothèque gmp (par exemple, installez libgmp3-dev au lieu de libgmp10-dev).

+0

Mais ne le relierait-il pas dynamiquement à libgmp3, ce qui signifie qu'il ne fonctionnera pas sous Ubuntu 11.10 et éventuellement d'autres distributions Linux ? Vous mentionnez également libgmp générique. Y at-il un moyen d'utiliser le binaire quelle que soit la version de libgmp qu'il rencontre? – FalconNL

+0

Avec libgmp générique, je voulais dire le paquet générique, qui fournit automatiquement la version actuelle de libgmp. Vous ne pouvez pas lier génériquement votre programme car un nouveau numéro de version majeure signifie que la fonctionnalité a été supprimée lors de la transition de libgmp3 à libgmp10. Votre programme fonctionnerait aussi sur Ubuntu 11.10, car Ubuntu 11.10 dispose toujours de libgmp3 (plusieurs versions majeures peuvent être installées en parallèle). Récapitulatif: Si -static est une option suffisante pour vous, c'est OK, et si vous utilisez -dynamic, utilisez la plus ancienne bibliothèque raisonnable. – thiton

+0

Assurez-vous simplement que votre .deb indique une dépendance sur la version requise de la bibliothèque dynamique dans son fichier de contrôle. – tripleee

1

Vous avez l'option ghc -static pour établir une liaison statique avec les bibliothèques.

+0

Ah, donc sur Linux, vous devez activer explicitement cela? J'ai toujours pensé que GHC était toujours compilé statiquement par défaut. Je vais essayer quand je rentre à la maison. – FalconNL

+0

Ok, j'ai essayé de compiler avec -static et malheureusement j'ai toujours le même message d'erreur. Des idées de ce que je fais mal? – FalconNL