Немаловажно при сборке бинарников - приготовить правильное сборочное окружение. Не настолько важно, как написание портабельного кода, но тем не менее. Вот несколько моих советов.
1). Не компилируйте в последней на данной момент убунте (арче, федоре). Конечный пользователь обязательно словит «GLIBC_2.23 not found». Причём по нажатию по значку программы ничего не произойдёт - ошибку напишут в консоли
2). Какие библиотеки положить с прогой, а какие - нет, вам подскажет стандарт LSB. В разделах Core, Desktop и так далее есть подраздел «3.1. Relevant Libraries», перечисляющий те файлы системных библиотек, которые обязаны быть в каждом дистрибутиве Linux (хотя бы в репозиториях).
Я иногда сталкиваюсь с незнанием о существовании LSB. Например, некоторые игрушки в Стиме «тащат с собой» libm и libXfixes, непонятно зачем. Также одно время его тащил бинарник 2GIS, но потом это исправили (разработка 2GIS приостановлена).
Libjpeg62, libpng12, библиотеки иксов, GTK, cups, libGLU можно прописать как зависимость RPM или DEB пакета. А всякие там wxWidgets, OpenCV, ffmpeg можно положить в архив с программой, и «подцеплять» при запуске. Отдельно можно сказать про Qt: в LSB - устаревшая версия, поэтому новую версию можно также положить в архив с программой.
3). Компилятор GCC можно приготовить особенным образом, чтобы скомпилированная прога не требовала новый C++ Runtime. Например, в стиме, запущенном в Ubuntu 12.04, перестал работать веб-браузер, потому что Webkit стал требовать GCC 4.9 минимум, а в системе - 4.6. Valve просто не знали как компильнуть правильно.
А вот Canonical знают: гляньте в свойства Firefox 52 из состава этой версии убунты. about:buildconfig говорит, что собрано в GCC 4.8. При этом никакого C++ Runtime не требует!
Достигается это следующим образом. Компилировать с новым GCC, линковать со старыми либами. В дистрибутиве Linux «CentOS 6» существует замечательный репозиторий devtoolset, позволяющий установить в систему GCC 6. Готовые бинарники зависят от C++ Runtime от GCC 4.4, а также от Glibc 2.12. Красота!
Если прямоты рук не хватило, чтобы избавиться от зависимости от нового C++ Runtime - можно по-старинке положить libgcc_s и libstdc++ в архив с прогой - как это делает Icculus в DRM-free портах игр.
4). CentOS 6 вообще замечательная база для билд-фермы! X-Server 1.7 имеет поддержку Xinput 2.0, тогда как SLES 11 имеет X-Server 1.6 без такой поддержки. Xrandr в CentOS 6 уже используется для мульти-мониторых конфигураций, тогда как в CentOS 5 ещё использовался Xinerama, а Xrandr - только для смены разрешения экрана. В общем, дистр - довольно современный, и всё, что нужно, там есть.
А ещё там куча репозиториев: EPEL, Rpmfusion, Repoforge, Qt. Из них можно установить GTK3, wxWidgets последней версии, последний BOOST, последний GCC, и так далее.
5). В случае, если вы собираете игру, хедеры OpenGL лучше использовать от Khronos Group. Умолчальные Месовские, в теории, те же самые, но в случае CentOS 6 - старые. Сам файл библиотек, с которым будете линковать, обязательно должен быть месовским, а не NVIDIA или AMDGPU-PRO. И желательно чтобы файл библиотеки был старым. А header-ы - новые.
6). В DRM-free копиях игр есть замечательные скрипты запуска игр, которые подцепляют lib32 или lib64.
7). Меня бест ошибка «libpulse.so.0 не найден». Линкуйте её через dlopen(), блин! То же самое можно сказать про libcurl.so.4, libcurl.so.5 и libudev.so.0 и libudev.so.1. Такие проги, как Google Chrome, слинковались с этими библиотеками с помощью dlopen() (можно проверить командой strings chrome | grep lib
), причём с несколькими версиями сразу. Я не знаю как.