Могу ли я статически связать модули Cython с исполняемым файлом, в который встроен Python?

В настоящее время у меня есть исполняемый файл, скомпилированный из C++, в который встроен python. Встроенный исполняемый файл запускает скрипт Python, который загружает несколько модулей Cython. И модули Cython, и исполняемый файл связаны с общей библиотекой.

Я хочу переместить общую библиотеку в исполняемый файл, статически связав общую библиотеку с исполняемым файлом.

Могу ли я статически связать модули Cython с исполняемым файлом, в который встроен Python? Каков наилучший способ справиться с этой ситуацией?


person HaltingState    schedule 03.12.2011    source источник


Ответы (1)


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

Один из возможных способов сделать это:

  • Скомпилируйте свой собственный python с патчем dynload которые предпочитают не использовать dlopen() вашего модуля, а напрямую использовать dlsym(), чтобы проверить, находится ли модуль уже в памяти.

  • Создайте libTEST.a, включая все .o, сгенерированные в процессе сборки (не .so). Вы можете найти его обычно в build/temp.* и сделать что-то вроде этого:

    ar rc libTEST.a build/temp.*/*.o
    ranlib libTEST.a
    
  • При компиляции основного исполняемого файла вам необходимо добавить зависимость к этому новому libTEST.a, добавив в командную строку компиляции:

    -lТЕСТ -Л.

Результат даст вам исполняемый файл со всеми символами из ваших модулей cython, и python сможет искать их в памяти.

(В качестве примера я использую расширенную оболочку, которая перенаправляет ld во время компиляции, чтобы не создавать .so, и создает .a в конце. На kivy-ios, вы можете скачать liblink, который используется для создания .o, и biglink, который используется для захвата всех .o в каталогах и создания .a. Вы можете увидеть, как он используется в build_kivy.sh)

person tito    schedule 06.12.2011