44 votes

Compiler l'interpréteur Python de manière statique?

Je construis un interpréteur Python incorporé spécial et je veux éviter les dépendances sur les bibliothèques dynamiques. Je souhaite donc compiler l'interpréteur avec des bibliothèques statiques (par exemple, libc.a non libc.so ).

J'aimerais également lier statiquement toutes les bibliothèques dynamiques faisant partie de la bibliothèque standard Python. Je sais que cela peut être fait en utilisant Freeze.py , mais existe-t-il une alternative pour le faire en une seule étape?

31voto

Jeremy Cowles Points 336

J'ai trouvé ceci (principalement en ce qui concerne la compilation statique des modules Python):

Qui décrit un fichier de configuration situé ici:

<Python_Source>/Modules/Setup

Si ce fichier n'est pas présent, il peut être créé par copie:

<Python_Source>/Modules/Setup.dist

L' Setup le fichier a des tonnes de documentation et l' README inclus avec la source offre beaucoup de bonne compilation de l'information ainsi.

Je n'ai pas essayé de compiler encore, mais je pense qu'avec ces ressources, je devrait être un succès quand je l'ai essayer. Je vais poster mes résultats comme un commentaire ici.

Mise à jour

Pour obtenir un pur-statique python exécutable, vous devez également configurer comme suit:

./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"

Une fois que vous générez avec ces drapeaux activé, vous aurez probablement obtenir beaucoup de mises en garde sur "renommer car la bibliothèque n'est pas présent". Cela signifie que vous n'avez pas configuré Modules/Setup correctement et la nécessité de:

a) d'ajouter une seule ligne (près du haut) comme ceci:

*static*

(c'est asterisk/star le mot "statique" et l'astérisque sans les espaces)

b) retirez commentaires de tous les modules que vous voulez être disponible de façon statique (comme les mathématiques, tableau, etc...)

Vous pouvez également ajouter des drapeaux de l'éditeur de liens (comme indiqué dans le lien que j'ai posté ci-dessus). Mon expérience a été que les bibliothèques sont de travail sans modification.

Il peut également être utile pour exécuter le faire de la façon suivante:

make 2>&1 | grep 'renaming'

Cela montrera tous les modules qui ne sont pas à compiler en raison d'être lié statiquement.

6voto

Martin v. Löwis Points 61768

L'aide de gel ne les empêche pas de le faire en un seul passage (peu importe l'approche que vous utilisez, vous aurez besoin de plusieurs étapes de génération - par exemple de nombreuses compilateur invocations). Tout d'abord, vous modifiez Modules/Setup d'inclure tous les modules d'extension que vous souhaitez. Ensuite, vous construisez Python, obtenir libpythonxy.un. Ensuite, vous exécutez gel, l'obtention d'un certain nombre de C et fichiers de configuration.c. Vous compilez ces derniers aussi bien, et de les intégrer dans libpythonxy.un (ou de créer une bibliothèque séparée).

Vous faire tout cela à la fois, pour chaque architecture et de la version de Python que vous souhaitez intégrer. Lors de la construction de votre application, vous seul lien avec libpythonxy.un, la bibliothèque et que le gel a produit.

3voto

fco.javier.sanz Points 1582

Vous pouvez essayer avec ELF STATIFIER . Je l'ai déjà utilisé et cela fonctionne assez bien. J'ai eu quelques problèmes avec cela dans quelques cas, puis j'ai dû utiliser un autre programme similaire appelé Ermine . Malheureusement, celui-ci est un programme commercial.

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