Скомпилировать интерпретатор Python статически? - PullRequest
41 голосов
/ 19 июля 2009

Я создаю встроенный интерпретатор Python специального назначения и хочу избежать зависимости от динамических библиотек, поэтому вместо этого я хочу скомпилировать интерпретатор со статическими библиотеками (например, libc.a, а не libc.so).

Я также хотел бы статически связать все динамические библиотеки, которые являются частью стандартной библиотеки Python. Я знаю, что это можно сделать с помощью Freeze.py, но есть ли альтернатива, чтобы сделать это за один шаг?

Ответы [ 4 ]

31 голосов
/ 20 июля 2009

Я нашел это (в основном, относительно статической компиляции модулей Python):

Который описывает файл, используемый для конфигурации, расположенный здесь:

<Python_Source>/Modules/Setup

Если этот файл отсутствует, его можно создать, скопировав:

<Python_Source>/Modules/Setup.dist

Файл Setup содержит тонны документации, а README, включенный в исходный код, также предлагает много полезной информации о компиляции.

Я еще не пробовал компилировать, но я думаю, что с этими ресурсами я должен быть успешным, когда попробую. Я опубликую свои результаты как комментарий здесь.

Обновление

Чтобы получить чисто статический исполняемый файл Python, вы также должны настроить его следующим образом:

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

После того, как вы соберете эти флаги, вы, скорее всего, получите много предупреждений о «переименовании, потому что библиотеки нет». Это означает, что вы неправильно настроили Modules/Setup и вам необходимо:

а) добавить одну строку (около верха), например:

*static*

(это звездочка / звездочка, слово "статический" и звездочка без пробелов)

б) раскомментируйте все модули, которые должны быть доступны статически (например, математические, массивные и т. Д.)

Вам также может понадобиться добавить определенные флаги компоновщика (как упомянуто в ссылке, которую я разместил выше). Мой опыт показывает, что библиотеки работают без изменений.

Также может быть полезно запустить make следующим образом:

make 2>&1 | grep 'renaming'

Здесь будут показаны все модули, которые не удалось скомпилировать из-за статической связи.

8 голосов
/ 04 января 2015

CPython CMake Buildsystem предлагает альтернативный способ сборки Python, используя CMake .

Он может собирать Python-библиотеку статически и включать в нее все нужные вам модули. Просто установите параметры CMake

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

и установите BUILTIN_<extension>, который вы хотите ON.

6 голосов
/ 19 июля 2009

Использование freeze не мешает делать все это за один прогон (независимо от того, какой подход вы используете, вам потребуется несколько этапов сборки - например, много вызовов компилятора). Сначала вы редактируете Modules/Setup, чтобы включить все необходимые модули расширения. Далее вы строите Python, получая libpythonxy.a. Затем вы запускаете freeze, получая несколько файлов C и файл config.c. Вы также компилируете их и интегрируете в libpythonxy.a (или создаете отдельную библиотеку).

Вы делаете все это один раз для каждой архитектуры и версии Python, которую вы хотите интегрировать. При создании приложения вы связываетесь только с libpythonxy.a и библиотекой, которая замерзла.

3 голосов
/ 20 июля 2009

Вы можете попробовать с ELF STATIFIER . Я использовал его раньше, и он работает довольно хорошо. У меня просто были проблемы с ним в нескольких случаях, а затем мне пришлось использовать другую похожую программу под названием Ermine . К сожалению, это коммерческая программа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...