Поддерживает ли python + pyinstaller несколько ОС / версий Linux? - PullRequest
0 голосов
/ 09 апреля 2019

Я написал несколько небольших скриптов на python и собрал двоичные файлы с помощью pyinstaller.

Когда я собирал их на моей машине с Ubuntu 16.04 - они отлично работали на той машине, где я их собирал.Но перемещение файла на компьютер Centos / Redhat 7.4 привело бы к GCLIB и другим ошибкам зависимости от версии .so.

  • Построение одного и того же двоичного файла на докере с той же версией Centos не дало бы этих ошибок.
  • Если я попытаюсь запустить бинарный файл, скомпилированный на Centos 7.4 на Centos 6.6, я снова получу ошибки - Но, опираясь на Centos 6.6, он будет работать правильно с Centos 6.6

Я решилпроблема с использованием более низкой версии Centos для создания моих двоичных файлов на данный момент.

  • Мой конкретный вопрос: в Python это общий подход к построению двоичных файлов на разных ОС на основе целевой ОС, для которой она предназначена (при условии, только цели linux) или кто я?делать это взломать / плохой способ решения этой проблемы?

Я пытаюсь понять, как эта проблема решается стандартным способом.

1 Ответ

1 голос
/ 09 апреля 2019

Поскольку бинарный файл, создаваемый pyinstaller, зависит только от glibc, то это должен быть правильный подход для сборки его на самой старой из доступных систем, и он должен работать на будущих системах.

В целом, glibc разработан для обеспечения обратной совместимости, поэтому приложения, созданные на основе более старой версии glibc, будут по-прежнему работать с более новым glibc, но не наоборот. Это осуществляется с помощью управления версиями символов, в котором каждому символу, на который вы ссылаетесь, может быть присвоена версия, и в любом случае, когда более новый glibc изменил ABI какой-либо функции, он также будет иметь подпрограмму совместимости со старым открытым ABI. с более старой версией символа, так что приложения, связанные со старой, будут динамически связываться с подпрограммой совместимости, в то время как у вас есть приложение, связанное с более новыми версиями символов, не будет более новых версий в более старом glibc для динамического связывания к.

Хотя другие библиотеки также могут это делать, не многие авторы библиотек беспокоятся об этом, поэтому более новые версии могут просто быть несовместимыми, в то время как разработчики glibc обычно пытаются сохранить совместимость.

Так что да, если конечные двоичные файлы связаны только с glibc или другими библиотеками, которые следуют аналогичной схеме управления версиями символов, чтобы гарантировать, что более старые двоичные файлы будут по-прежнему надлежащим образом связываться с более новыми версиями библиотеки, то вполне допустимо создавать против более старой версии, а затем запустите ее на более новых версиях различных дистрибутивов Linux, и даже в целом на дистрибутивах.

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

...