Ich verwende mehrere Versionen von Python auf meinem Computer: 2.6.6
, 2.7.6
und 2.7.9
. Wenn ich Boost mit boost-python kompiliere, muss ich Python als Argument angeben. Wenn ich Kompatibilität will, muss ich Boost für jede Python-Version kompilieren? (es ist ziemlich riesig!) Oder gibt es eine Möglichkeit, nur einen Build von Boost mit mehreren Python-Versionen zu verwenden?Build Boost mit mehreren Python-Versionen
Antwort
Das offizielle Python development cycle beschreibt nicht die Stabilität der binären Anwendungsschnittstelle (ABI) zwischen den Releases. Für Releases vor Python 3.2 gibt es keine Garantie für die ABI-Kompatibilität. Für 3.2 und darüber hinaus definiert PEP 384 die stable ABI, bei der eine Teilmenge der Python/C-API die ABI-Kompatibilität gewährleistet. Um diese Untergruppe zu verwenden, muss Py_LIMITED_API
beim Erstellen von Boost.Python- und Erweiterungsmodulen definiert werden.
Während es hängt in erster Linie auf die Python/C API-Typen und Funktionen werden direkt in der Benutzercode oder durch Boost.Python, im allgemeinen verwendet:
- für Hauptebene Mitteilungen, wie Python 2 und Python 3, Boost.Python und Benutzercode wird
- für kleinere Ebene Releases werden müssen neu kompiliert, wie Python 2.6 und Python 2.7, Boost.Python und Benutzercode benötigen
- für Mikroebene Releases neu kompiliert werden, Boost.Python und Benutzercode müssen selten neu kompiliert werden
In allen Fällen, in denen Boost.Python neu kompiliert werden muss, sollte keine andere Boost-Bibliothek neu kompiliert werden müssen. Wenn Sie mehrere Versionen von Boost.Python erstellen, überprüfen Sie, ob sauber Build auftritt. Ohne einen sauberen Build kann Boost.Python zwar bauen, aber nicht richtig verlinken. Zum Beispiel sollte das PyClass_Type
Symbol nicht in Python 3 Boost.Python baut referenziert werden, aber ohne bereinigter Build, vorherige Build-Artefakte, die Bibliothek füllen können:
$ ./bootstrap.sh --with-python=/usr/bin/python2
...
Detecting Python version... 2.7
$ ./b2 --with-python --buildid=2 # produces libboost_python-2.so
$ ./bootstrap.sh --with-python=/usr/bin/python3 --with-python-root=/usr
...
Detecting Python version... 3.3
$ ./b2 --with-python --buildid=3noclean # produces libboost_python-3noclean.so
$ ./b2 --with-python --clean
$ ./b2 --with-python --buildid=3 # produces libboost_python-3.so
$ nm -D stage/lib/libboost_python-2.so | grep PyClass_Type
U PyClass_Type
$ nm -D stage/lib/libboost_python-3noclean.so | grep PyClass_Type
U PyClass_Type
$ nm -D stage/lib/libboost_python-3.so | grep PyClass_Type
Beachten Sie, dass, obwohl die 3noclean
Build gegen Python gebaut wurden 3, der vorherige Build, der Python 2 verwendete, hatte Artefakte, die die Bibliothek 3noclean
verschmutzten. Beachten Sie außerdem, dass Boost.Python und Benutzercode möglicherweise neu kompiliert werden müssen, um der Python-CPU-Architektur und UCS-2- oder UCS-4-Unicode-Konfigurationen zu entsprechen.
Danke für diese Antwort! – Caduchon
Kompilierung Boost für Python 2.7.9 ** sollte für alle Versionen von Python bis 2.5 funktionieren. Obwohl es für Python 3 nicht funktioniert. – randomusername