Является ли Linux бинарный универсальным для всех видов дистрибутивов?

15

Мне довелось установить модель симулятора VHDL на Linux. В руководстве говорится, что он поддерживает только RedHat или Suse, но я только что попытался установить его на Ubuntu. И я мог бы установить его без проблем.

введите описание изображения здесь

  • Является ли Linux бинарный универсальным для всех видов распространения? Я имею в виду, если я создаю программу на дистрибутиве А, могу ли я быть уверен, что она будет работать на любом Linux?
  • Почему большинство поставщиков коммерческих программ говорят, что программа работает в определенном дистрибутиве? (в основном Redhat и Suse, а не Ubuntu)
prosseek
источник

Ответы:

15

Это два вопроса:

Является ли бинарный файл Linux универсальным для всех дистрибутивов?

По-разному:

  • Если программа не использует ничего вне ядра Linux, она будет универсальной, за исключением 32- или 64-битного вопроса. Linux "hello world" (минималистичная программа, которая просто печатает "hello world" в окне терминала), вероятно, может быть независимым от дистрибутива.
  • Если программа использует какую-либо неосновную библиотеку или службу (которая является большей частью Linux, ядро ​​довольно маленькое), существуют различия в том, какие библиотеки включены, какие версии этих библиотек и где они расположены. Таким образом, в этом (наиболее распространенном) случае распределения не равны.

Почему многие коммерческие программы говорят, что они работают только на одном или нескольких дистрибутивах?

Потому что существует очень много дистрибутивов Linux , и никто не хочет тестировать их программы на всех них.

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

Какие дистрибутивы будут выбраны для тестирования, зависит от того, что продавец ожидает от своих клиентов. Коммерческие / профессиональные программы обычно выбирают корпоративные дистрибутивы, возможно, исходя из соображений, подобных «люди, которые заплатили за их ОС, с большей вероятностью будут платить за наше программное обеспечение», возможно, просто путем подсчета дистрибутивов, используемых их существующими клиентами.

См. Также Марк Шаттлворт (парень, который является причиной того, что у нас есть Ubuntu, в первую очередь) о бинарной совместимости между Ubuntu и Debian - Debian - ближайший родственник Ubuntu.

JG-Фауст
источник
2

И RedHat, и SUSE имеют давние корпоративные Linux-традиции и смогли изготовить и протестировать эти пакеты. Со временем появится больше примеров пакетов, которые были протестированы для работы в Ubuntu. Фактически, многие такие пакеты с прошлого года проходят тестирование на работу с Ubuntu. Поскольку Canonical заключает соглашения с большим количеством поставщиков, будет больше пакетов, сертифицированных Ubuntu.

Первый вопрос: если вы хотите создать программу, которая будет работать во всех дистрибутивах, создайте статический (по сравнению с динамическим) исполняемый файл. statically-linkedИсполняемый файл не зависит от системных библиотек, поэтому может работать между распределениями, до тех пор , как архитектура (например, Intel / AMD) является тем же самым .

Вот программа,

int main(void)
{ 
  printf("Hello, World!\n");
  return 0;
}

Давайте скомпилируем как обычно,

$ gcc helloworld.c -o helloworld
$ ./helloworld
Hello, World!
$ ldd helloworld
    libc.so.6 => /lib/libc.so.6 (0x00007f3cc3481000)
...
$ 
$ gcc helloworld.c -static -o helloworld_static
$ ./helloworld
Hello, World!
$ ldd helloworld_static
    not a dynamic executable
$ 

Итак, что вы можете сделать с этой программой VHDL? Получите файл .rpm и преобразуйте его в .deb, используя иностранца . Затем установите. Если это сработало, ты в порядке. Если это не работает, используйте, lddчтобы выяснить, какой файл библиотеки отсутствует. В худшем случае создайте виртуальную машину для других дистрибутивов Linux и запустите программу там.

user4124
источник
1

Я второй ответ jg-faustus, но вы также должны быть осторожны с форматом пакета. Даже если сами исполняемые файлы являются переносимыми и присутствуют все необходимые библиотеки, разные дистрибутивы размещают файлы в разных местах и ​​используют разные инструменты для управления установленными пакетами. Если поставщик упаковывает свой продукт как пакет RPM, вам придется использовать пакет типа ' Alien 'для конвертации и установки в дистрибутив на основе DEB, например Ubuntu.

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

ImaginaryRobots
источник