Beim Erstellen von Python unter Linux gibt es eine Konfigurationsoption namens "--enable-shared". Ich werde dies erklären und Ihnen einige Tipps geben. Ich habe Python als konkretes Beispiel gegeben, aber ich denke, dass der größte Teil des Inhalts anderen Sprachen und Bibliotheken gemeinsam ist.
Wenn Sie diese Option nicht angeben, haben Sie eine ausführbare Datei mit dem Namen "python" und eine Bibliotheksdatei mit dem Namen "libpython2.7.a" (für Python 2.7) als Hauptbinärdateien. Wenn Sie "--enable-shared" hinzufügen, wird auch ein freigegebenes Objekt für eine dynamische Verknüpfung mit dem Namen "libpython2.7.so" generiert, und "python" verknüpft dieses freigegebene Objekt dynamisch.
Linux-Distributionen wie Debian erstellen normalerweise Python mit dieser Option. Dies liegt daran, dass viele Programme für die Verwendung von Python erstellt wurden. Wenn Sie "libpython2.7.a" direkt verknüpfen, müssen Sie alle aktualisieren, wenn Sie Python aktualisieren.
Ich empfehle "--enable-shared" nicht, da dieser Vorteil, wenn Sie Python selbst erstellen, nicht wirklich zum Leben erweckt wird, sondern für jeden ärgerlich sein kann, der mehrere Versionen gleichzeitig verwenden möchte. Wenn Sie aus irgendeinem Grund kein freigegebenes Objekt verwenden möchten, müssen Sie den Rest nicht lesen.
Wenn eine ausführbare Python-Datei oder ein Programm, das Python als Bibliothek verknüpft, wie z. B. mod_wsgi, von libpython2.7.so abhängig wird, lautet das laufende Programm erwartungsgemäß libpython2.7.so. Es besteht die Möglichkeit, dass Sie nicht verwenden.
Wenn Sie beispielsweise mit --prefix = / usr / local / Python-2.7.3
erstellen und installieren, können Sie / usr / local / Python-2.7.3 / bin / python
ausführen, um Umgebungsvariablen festzulegen. Je nach Situation kann "/ usr / lib / libpython2.7.so" oder "/ usr / local / Python-2.7.2 / lib / libpython2.7.so" verwendet werden.
Sie können die Umgebungsvariable LD_LIBRARY_PATH verwenden, um den Speicherort der Bibliothek anzugeben, die bevorzugt geladen werden soll. Wenn Sie jedoch mehrere Versionen von Python parallel verwenden, ist es schwierig, die Umgebungsvariable selbst zu wechseln. Wenn eine andere Person denselben Server verwendet, kann diese Person verwirrt sein.
Vielleicht ist dies ein unkomplizierter Ansatz. Der Speicherort der Verknüpfung "libpython2.7.so" wird mit dem vollständigen Pfad auf der Seite aufgezeichnet, die die dynamische Verknüpfung herstellt, z. B. die ausführbare Datei "python".
Um den Pfad festzulegen, können Sie bei der Konfiguration einfach LDFLAGS angeben.
$ ./configure --prefix=$HOME/python27 --enable-shared \
LDFLAGS=-Wl,-rpath,$HOME/python27/lib
Der einzige Nachteil bei der Verwendung von rpath besteht darin, dass die Portabilität des Kopierens des gesamten Python in ein anderes Verzeichnis mit cp -r usw. und des Umschreibens des Shebang im Skript in bin / beeinträchtigt wird. Wenn sich in virtualenv libpython2.7.so am ursprünglichen Speicherort befindet, funktioniert es weiterhin, sodass es kein Problem gibt. Wenn Sie jedoch virtualenv verwenden, wissen Sie nicht, wie lange die alte Version von Python verwendet wird, und Sie möchten sie nicht löschen. Kopieren Sie also das Ganze Es wird nicht für Personen empfohlen, die es verwenden möchten.
Wenn Sie ein freigegebenes Objekt für einen bestimmten Zweck benötigen, die ausführbare Python-Datei es jedoch nicht dynamisch verknüpfen muss, gibt es eine Möglichkeit, libpython2.7.a beim Erstellen von Python zu verknüpfen. .. Öffnen Sie dazu Makefile nach Konfiguration und
BLDLIBRARY= -L. -lpython$(VERSION)
Wo ist es
BLDLIBRARY= libpython$(VERSION).a
Ich werde es umschreiben.
Das Debian-Paket Python scheint mit libpython2.7.so auf ähnliche Weise aufgebaut zu sein, aber Python verknüpft libpython statisch. Der Grund scheint zu sein, dass das gemeinsam genutzte Objekt PIC war und eine schlechte Leistung aufwies. (Dies ist auch der Grund, warum vim Python 2 und 3 nicht gleichzeitig verwenden kann.)
Recommended Posts