Я полагаю, что проблема называется "двоичная совместимость" ( тег в переполнении стека посвящен этим проблемам). Когда вы связываете двоичный файл на машине, окружающая среда влияет на двоичный файл, и, будучи запущенным на другом компьютере, он все еще пытается найти среду, аналогичную той, в которой он был скомпилирован.
Допуск к различным средам в этом случае называется двоичной совместимостью .
Как это работает?
Ключевым моментом здесь является то, что даже если вы укажете одинаковые опции для компоновщика на разных машинах, вы все равно можете получить разные двоичные файлы. Например, если вы связываете свой двоичный файл с общей библиотекой с помощью -lfoo
, точная версия foo
, установленная на компьютере, на котором вы работаете (например, libfoo.so.5
), жестко закодирована в двоичный файл. Когда он запускается на компьютере B
, он может содержать только libfoo.so.4
, и двоичный файл откажется запускаться, потому что ему нужен отсутствующий файл libfoo.so.5
. Вот почему перекомпиляция помогает, а без нее не работает.
Пакеты Ubuntu - и пакеты любого другого дистрибутива - все скомпилированы в одной среде (друг с другом). Вот почему они хорошо устанавливаются. А поставщики дистрибутивов следят за тем, чтобы каждая следующая версия была обратно совместима с предыдущими.
Что мне делать?
Если вы хотите, чтобы ваше программное обеспечение было совместимо с различными дистрибутивами, это проще, чем вы думали. Сначала попробуйте скомпилировать ваше приложение на самой старой версии . Поскольку, как я упоминал ранее, современные дистрибутивы обычно обратно совместимы, ваша программа, скорее всего, будет работать на более новых дистрибутивах без проблем.
Чтобы более тщательно проверить полученный пакет и получить дополнительные советы по совместимости, вы можете воспользоваться нашим бесплатным Linux Application Checker . Вы также можете быть заинтересованы в общих советах по упаковке Linux soft .