Скомпилировать интерпретатор Python статически?
Я создаю встроенный интерпретатор Python специального назначения и хочу избегать зависимости от динамических библиотек, поэтому я хочу вместо этого скомпилировать интерпретатор со статическими библиотеками (например, libc.a
not libc.so
).
Я также хотел бы статически связать все динамические библиотеки, которые являются частью стандартной библиотеки Python. Я знаю, что это можно сделать с помощью Freeze.py
, но есть ли альтернатива, чтобы это можно было сделать за один шаг?
Ответы
Ответ 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. К сожалению, это коммерческая программа.