История изменений
Исправление ZenitharChampion, (текущая версия) :
Компилируй в GCC 4.1, чтобы была совместимость с любыми дистрибутивами Linux 2006 года и старше, либо клади libgcc и libstdc++.so.6 в каталог с программой. Используй как можно меньше сторонних системных библиотек, либо клади их в каталог с программой. 50 зависимостей, выдаваемых ldd - это слишком много. Завтра fontconfig или libvorbis может обновиться, и твоя программа больше не запустится. От статической линковки старайся отказаться, иначе если твоя программа пользуется сетью, её могут сломать через старую уязвимость в libtiff или любой другой библиотеке. Также может помочь dlopen, когда есть правила для работы с разными версиями библиотек и соответственно. разными API.
Почитай стандарт LSB, в частности про основные системные библиотеки, которые обязаны быть в каждой системе Linux, всякие там libm, libc, libpthreads. Также там есть стандарт на многие системные библиотеки, постарайся компилировать с ними. Даже если последнгий libpng сегодня 1.5, компилируй с 1.2 - потому что он в стандарте LSB. Даже если в системе его нет, в репозитории дистрибутива он обязан быть. Qt там прописан 4.3 - вот с ним и компилируй.
Плохой пример проприетарной программы. Скомпилированная в Gentoo testing с GCC 4.8 из текущего GIT, с Qt 4.9 и SDL 1.4. Она ни у кого не запустится. Хороший пример проприетарной программы - Nero, Java, Skype (нет зависимости от PulseAudio, но если это есть в системе, оно используется), Maya, Opera, Adobe Flash/Air/Reader, Crossover (может использовать системные библиотеки разных API и говорить, если библиотеки нет и о том, какой функционал будет недоступен), игры, портированные Icculus, проприетарные драйверы видеокарт.
Открытое ПО распространяется по другому принципу. Бинарные пакеты можно распространять только для нескольких популярных дистрибутивов Linux и соответственно установленных в них системных библиотек. Для этого хорошо подходит сервис Open Build System (OBS), которым воспользовались VLC и Arx Libertatis. Видишь, как красиво получилось? И всё это с минимальными усилиями. В таком случае создавать универсальную бинарную сборку с как можно меньшим количеством библиотек-зависимостей не обязательно. С помощью OBS ещё и будет обеспечено обновление средствами дистрибутива, чего нет, например, у VirtualBox, у которого тоже много пакетов для попудярных дистрибутивов Linux и их разных версий.
Распространять можно в RPM (стандарт), DEB, tar.gz и самораспаковывающемся архиве. Обычно поддерживаются архитектуры процессора x86 и x86_64, но при желании можно сделать только x86, или наоборот, больше архитектур.
Информация о том, что с новыми GCC ломается совместимость, уже неактуальна. Можно смело компилировать в GCC 4.1.2 и запускать в системе с GCC 4.7. Но не наоборот - даже если компилировалось в GCC 4.2, в системе с GCC 4.1 уже не запустится. Только в системе с GCC 4.2 и старше. Версия ядра также не важна, хоть в 3.4 омпилируй, хоть в 2.6.10.
Исходная версия ZenitharChampion, :
Компилируй в GCC 4.1, чтобы была совместимость с любыми дистрибутивами Linux 2006 года и старше, либо клади libgcc и libstdc++.so.6 в каталог с программой. Используй как можно меньше сторонних системных библиотек, либо клади их в каталог с программой. 50 зависимостей, выдаваемых ldd - это слишком много. Завтра fontconfig или libvorbis может обновиться, и твоя программа больше не запустится. От статической линковки старайся отказаться, иначе если твоя программа пользуется сетью, её могут сломать через старую уязвимость в libtiff или любой другой библиотеке. Также может помочь dlopen, когда есть правила для работы с разными версиями библиотек и соответственно. разными API.
Почитай стандарт LSB, в частности про основные системные библиотеки, которые обязаны быть в каждой системе Linux, всякие там libm, libc, libpthreads. Также там есть стандарт на многие системные библиотеки, постарайся компилировать с ними. Даже если последнгий libpng сегодня 1.5, компилируй с 1.2 - потому что он в стандарте LSB. Даже если в системе его нет, в репозитории дистрибутива он обязан быть. Qt там прописан 4.3 - вот с ним и компилируй.
Плохой пример проприетарной программы. Скомпилированная в Gentoo testing с GCC 4.8 из текущего GIT, с Qt 4.9 и SDL 1.4. Она ни у кого не запустится. Хороший пример проприетарной программы - Nero, Java, Skype (нет зависимости от PulseAudio, но если это есть в системе, оно используется), Maya, Opera, Adobe Flash/Air/Reader, Crossover (может использовать системные библиотеки разных API и говорить, если библиотеки нет и о том, какой функционал будет недоступен), игры, портированные Icculus, проприетарные драйверы видеокарт.
Открытое ПО распространяется по другому принципу. Бинарные пакеты можно распространять только для нескольких популярных дистрибутивов Linux и соответственно установленных в них системных библиотек. Для этого хорошо подходит сервис Open Build System (OBS), которым воспользовались VLC и Arx Libertatis. Видишь, как красиво получилось? И всё это с минимальными усилиями. В таком случае создавать универсальную бинарную сборку с как можно меньшим количеством библиотек-зависимостей не обязательно. С помощью OBS ещё и будет обеспечено обновление средствами дистрибутива, чего нет, например, у VirtualBox, у которого тоже много пакетов для попудярных дистрибутивов Linux и их разных версий.
Распространять можно в RPM (стандарт), DEB, tar.gz и самораспаковывающемся архиве. Обычно поддерживаются архитектуры процессора x86 и x86_64, но при желании можно сделать только x86, или наоборот, больше архитектур.
Информация о том, что с новыми GCC ломается совместимость, уже неактуальна. Можно смело компилировать в GCC 4.1.1 и запускать в системе с GCC 4.7. Но не наоборот - даже если компилировалось в GCC 4.2, в системе с GCC 4.1 уже не запустится. Только в системе с GCC 4.2 и старше. Версия ядра также не важна, хоть в 3.4 омпилируй, хоть в 2.6.10.