À propos de l'option --enable-shared lors de la construction de Python sous Linux

Lors de la construction de Python sur Linux, il existe une option de configuration appelée --enable-shared, donc je vais l'expliquer et vous donner quelques conseils. J'ai donné Python comme exemple concret, mais je pense que la plupart du contenu est commun à d'autres langages et bibliothèques.

Qu'est-ce que --enable-shared?

Si vous ne spécifiez pas cette option, vous aurez un fichier exécutable appelé python et un fichier de bibliothèque appelé libpython2.7.a (pour Python 2.7) comme fichiers binaires principaux. Si vous ajoutez --enable-shared, un objet partagé pour le lien dynamique appelé libpython2.7.so est également généré, et python liera dynamiquement cet objet partagé.

Les distributions Linux telles que Debian construisent généralement Python avec cette option. C'est parce que de nombreux programmes sont construits pour utiliser Python, et si vous liez directement libpython2.7.a, vous devrez tous les mettre à jour lorsque vous mettez à jour Python.

Je ne recommande pas --enable-shared car si vous construisez vous-même Python, cet avantage ne prend pas vraiment vie, mais peut plutôt être ennuyeux pour quiconque souhaite utiliser plusieurs versions en parallèle. À moins que vous ne souhaitiez utiliser un objet partagé pour une raison quelconque, vous n'avez pas à lire le reste.

Problèmes lors de l'utilisation de --enable-shared

Lorsqu'un fichier exécutable python ou un programme qui lie Python en tant que bibliothèque, tel que mod_wsgi, devient dépendant de libpython2.7.so, le programme en cours d'exécution sera libpython2.7.so comme prévu. Il est possible que vous n'utilisiez pas.

Par exemple, si vous construisez et installez avec --prefix = / usr / local / Python-2.7.3, vous pouvez exécuter / usr / local / Python-2.7.3 / bin / python pour définir et les variables d'environnement. Selon la situation, / usr / lib / libpython2.7.so ou / usr / local / Python-2.7.2 / lib / libpython2.7.so peut être utilisé.

Vous pouvez utiliser la variable d'environnement LD_LIBRARY_PATH pour spécifier l'emplacement de la bibliothèque à charger de préférence, mais si vous utilisez plusieurs versions de Python en parallèle, il est difficile de changer vous-même la variable d'environnement. Si quelqu'un d'autre utilise le même serveur, cette personne peut être confuse.

Contre-mesure 1 Set rpath

C'est peut-être une approche simple. L'emplacement de la liaison libpython2.7.so sera enregistré avec le chemin complet du côté qui crée le lien dynamique, comme le fichier exécutable python.

Pour définir le rpath, il est facile de spécifier LDFLAGS lors de la configuration.

$ ./configure --prefix=$HOME/python27 --enable-shared \
    LDFLAGS=-Wl,-rpath,$HOME/python27/lib

Le seul inconvénient de l'utilisation de rpath est la portabilité de la copie de l'intégralité de Python dans un autre répertoire avec cp -r etc. et de la réécriture du shebang dans le script dans bin /. Dans virtualenv, si libpython2.7.so est à l'emplacement d'origine, cela continuera à fonctionner, donc il n'y a pas de problème, mais si vous utilisez virtualenv, vous ne savez pas combien de temps l'ancienne version de Python est utilisée et vous ne voulez pas l'effacer, alors copiez le tout Il n'est pas recommandé aux personnes qui souhaitent l'utiliser.

Contre-mesure 2 Lier statiquement libpython

Si vous avez besoin d'un objet partagé dans un but précis, mais que l'exécutable python n'a pas besoin de le lier dynamiquement, il existe un moyen de lier libpython2.7.a lors de la construction de python. .. Pour ce faire, ouvrez Makefile après avoir configuré et

BLDLIBRARY=     -L. -lpython$(VERSION)

Où est-ce que c'est

BLDLIBRARY=     libpython$(VERSION).a

Je vais le réécrire.

Le paquet Debian python semble être construit de la même manière, avec libpython2.7.so, mais python lie statiquement libpython. La raison semble être que l'objet partagé était PIC et avait de mauvaises performances. (C'est aussi la raison pour laquelle vim ne peut pas utiliser Python 2 et 3 en même temps)

Recommended Posts

À propos de l'option --enable-shared lors de la construction de Python sous Linux
Construire plusieurs environnements Python sur le même système
Réfléchissez à la programmation de Python sur votre iPad
Le monde a changé lorsque j'ai ouvert un gros projet Python (Django) sur Sourcetrail (Linux)
À propos du module Python venv
Installez JDK sur Linux
À propos de la fonction enumerate (python)
Collez le lien sous Linux
À propos des fonctionnalités de Python
Notes sur la construction de TinyEMU et le démarrage du noyau Linux sur Emscripten
Comportement à la fin de Linux moins en fonction de la source de connexion
Construire un environnement Python sur Mac
Installez Python Pillow sur Amazon Linux
Vérifiez le comportement lors de l'attribution de Python
Construire un environnement Python sur Ubuntu
Assistance lors de l'installation de l'oreiller sur python3.9
[Python] Qu'est-ce que @? (À propos des décorateurs)
Construire un environnement Python sur Ubuntu (lorsque pip n'était pas la valeur par défaut)
Sakura utilisant Python sur Internet
Présentation de l'environnement Python 3.5.2 sur Amazon Linux
python> os.path.join ('data', 'checkpoint')> 'data / checkpoint' sous linux
À propos de la liste de base des bases de Python
À propos de l'erreur que j'ai rencontrée en essayant d'utiliser Adafruit_DHT à partir de Python sur Raspberry Pi
L'option --security ne peut pas être utilisée avec la commande dnf sous CentOS Linux
[Python Kivy] À propos de la modification du thème de conception
Créer ScriptableObject en Python lors de la construction d'ADX2
Trouver des fichiers comme Linux Find en Python
À propos de l'environnement virtuel de Python version 3.7
[C] [python] Lire avec AquesTalk sous Linux
Remarques sur la construction de Python et pyenv sur Mac
Télécharger des fichiers sur le Web avec Python
Notifier Slack lorsque la commande Linux se termine
[Python] Une barre de progression sur le terminal
Installez Python 3.8, Pip 3.8 sur EC2 (Amazon Linux 2)
Compilation du noyau Linux (Linux 5.x sur Ubuntu 20.04)
Comment mettre à niveau correctement le logiciel lors de la construction de Linux (CentOS) avec Vagrant ~ En utilisant l'exemple de mise à niveau de Python 2.7 vers Python 3.6 ~
Je suis tombé sur un code de caractère lors de la conversion de CSV en JSON avec Python
Le jour où le serveur Flask fonctionnant sous Linux sur AWS était semi-persistant (fonctionnant en arrière-plan)
À propos de Linux
À propos de Linux
À propos de Linux
Mémo de correspondance lorsque la touche de direction ne peut pas être utilisée dans la ligne de commande python
À propos de Linux
Utilisez python sur Raspberry Pi 3 pour éclairer la LED quand il fait noir!
Un programmeur Java a étudié Python. (À propos des décorateurs)
[Linux] Lorsque "| (pipe)" ne peut pas être frappé sur CentOS7
[2020July] Vérifiez l'UDID de l'iPad sous Linux
À propos de la différence entre "==" et "is" en python
Remarque sur l'encodage lorsque LANG = C en Python
Écrire une note sur la version python de python virtualenv
Essayez CI le code python poussé sur GitHub.
Introduction à Python avec Atom (en route)
Un mémorandum sur la bibliothèque de wrapper Python tesseract