Подтвердить что ты не робот

Скомпилировать интерпретатор Python статически?

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

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

4b9b3361

Ответ 1

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

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

<Python_Source>/Modules/Setup

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

<Python_Source>/Modules/Setup.dist

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

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

Update

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

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

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

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

*static*

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

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

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

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

make 2>&1 | grep 'renaming'

Это покажет все модули, которые не скомпилируются из-за статической привязки.

Ответ 2

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

Он может создавать python lib статически и включать в это lib все модули, которые вы хотите. Просто установите параметры CMake

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

и установите BUILTIN_<extension> для ON.

Ответ 3

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

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

Ответ 4

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