Skompilować interpreter Pythona statycznie?
Buduję specjalny wbudowany interpreter Pythona i chcę uniknąć zależności od bibliotek dynamicznych, więc chcę skompilować interpreter z bibliotekami statycznymi (np. libc.a
nie libc.so
).
Chciałbym również statycznie połączyć wszystkie dynamiczne biblioteki, które są częścią standardowej biblioteki Pythona. Wiem, że można to zrobić za pomocą Freeze.py
, ale czy istnieje alternatywa, dzięki której można to zrobić w jednym kroku?
4 answers
Znalazłem to (głównie dotyczące statycznej kompilacji modułów Pythona):
Opisujący plik używany do konfiguracji znajdujący się tutaj:
<Python_Source>/Modules/Setup
Jeśli ten plik nie istnieje, można go utworzyć przez skopiowanie:
<Python_Source>/Modules/Setup.dist
Plik Setup
zawiera mnóstwo dokumentacji, a README
dołączony do źródła oferuje wiele dobrych informacji kompilacyjnych jako cóż.
Jeszcze nie próbowałem kompilacji, ale myślę, że z tymi Zasobami powinienem odnieść sukces, gdy spróbuję. Opublikuję moje wyniki jako komentarz tutaj.
Update
Aby uzyskać program wykonywalny Pythona o czystym statusie, musisz również skonfigurować w następujący sposób:
./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"
Gdy zbudujesz z włączonymi flagami, prawdopodobnie otrzymasz wiele ostrzeżeń o "zmianie nazwy, ponieważ biblioteka nie jest obecna". Oznacza to, że nie skonfigurowałeś Modules/Setup
poprawnie i musisz:
A) Dodaj a pojedyncza linia (w pobliżu góry) tak:
*static*
(to gwiazdka / gwiazdka słowo "static" i gwiazdka bez spacji)
B) odkomentuj wszystkie moduły, które chcesz być dostępne statycznie(takie jak matematyka, tablica itp...)
Może być również konieczne dodanie określonych FLAG linkera(jak wspomniano w linku, który opublikowałem powyżej). Z mojego dotychczasowego doświadczenia wynika, że biblioteki działają bez modyfikacji.
Pomocne może być również uruchomienie make Z as follows:
make 2>&1 | grep 'renaming'
Wyświetli wszystkie moduły, które nie są kompilowane ze względu na statyczne połączenie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 14:15:50
CPython CMake Buildsystem oferuje alternatywny sposób budowania Pythona, używając CMake .
Może budować lib Pythona statycznie i zawierać w niej wszystkie moduły, które chcesz. Po prostu ustaw opcje CMake
BUILD_SHARED OFF
BUILD_STATIC ON
I ustaw BUILTIN_<extension>
, które chcesz ON
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-04 19:49:26
Użycie freeze nie uniemożliwia wykonania tego wszystkiego w jednym uruchomieniu(bez względu na to, jakiego podejścia użyjesz, będziesz potrzebował wielu kroków budowania - np. wielu wywołań kompilatora). Najpierw edytujesz Modules/Setup
, aby uwzględnić wszystkie moduły rozszerzeń, które chcesz. Następnie budujesz Pythona, dostając libpythonxy.a. następnie uruchamiasz freeze, uzyskując liczbę plików C i konfigurację.c. je również kompilujesz i integrujesz z libpythonxy.a (lub utworzyć oddzielną bibliotekę).
Robisz to wszystko raz, dla każdej architektury i wersji Pythona, którą chcesz zintegrować. Podczas tworzenia aplikacji łączysz się tylko z libpythonxy.a, oraz bibliotekę, którą stworzył freeze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-19 17:54:36
Możesz spróbować z STATIFIER elfa . Używałem go wcześniej i działa dość dobrze. Po prostu miałem z tym problemy w kilku przypadkach, a potem musiałem użyć innego podobnego programu o nazwie Gronostaj. Niestety ten jest programem komercyjnym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-19 22:00:25