компиляция программы из исходного кода - процесс сложный. Оптимизация может не проводиться, а может проводиться под какой-либо процессор из серий Intel и AMD. Есть и флаги оптимизации, для краткости названные -O3, -O2. Скомпилированная с libjpeg с версией API 62 и будет работать только с libjpeg.so.62, а никак не с libjpeg.so.70. Однако тот же самый код можно скомпилировать в другой системе, и будет наоборот. Казалось бы, только это и стоит учесть при пакетировании программ: указываешь в зависимостях libjpeg.so.62, libpng.so.12 и распространяешь себе программу без проблем, при необходимости положив редкие и часто меняющие версию библиотеки с программой.
Но нет! Знаниями из предыдущего абзаца пакетирование программ для Linux не ограничивается! Есть ещё glibc, описание возможных проблем с которым занимает ещё два абзаца! А всё просто. DooM III вышел в 2004 году и запустится на всех дистрибутивах Linux от 2004 года и старше. Unreal Tournament 2004 - тоже. А если бы их портировали в 2010 году, то даже несмотря на слабые системные требования, игры не запустились бы на дистрибутивах 2004 года ни за что. Пришлось бы обновляться и обновляться.
Скачал официальный бинарник TeeWorlds с официального сайта, запустил, бинарник ругнулся в консоль, что версия GLIBC старая. Ну разумеется старая, 2006 года. Скачал исходник, скомпилировал, играю. Скачал Вангеров, не запускается с той же ошибкой - но публично доступного исходного кода нет...
Есть две хитрости, первая - пляска и LD_LIBRARY_PATH с libstdc++.so.6, например из Debian Sid. Оптимальный вариант, и кстати в инсталлятор DooM III положили libstdc++.so.6, однако размеры игры настолько велики, что парой мегабайтов можно пренебречь - чего не скажешь, например, о TeeWords или, например, uTorrent, который при всём функционале не занимает и мегабайта. Вторая хитрость - взять самый старый дистрибутив, который только найдёте, в котором libstdc++.so.6 (версии 6), скомпилировать игру в нём - готово! Везде потом работает и запускается. Казалось бы, ну что ещё надо? Но нет: в старую систему ещё и новые библиотеки нужно вкомпилировать, те же libjpeg и libpng, а если игра по сети то ещё и openssl и libcurl. А ещё часто встречается такой код, который отказывается компилироваться в GCC младше 4.5 или даже 4.6... CURL, SSL, PNG и JPEG к счастью к такому не относятся - я про код всяких там игрушек. То есть, ещё и нужно быть программистом, чтобы сделать универсальный и везде работающий бинарник по второму способу.
Вопрос: ну и зачем так надо было делать?! Есть же стандарт LSB, есть же API 6-й версии (libstdc++.so.6), ну так почему во всех системах работает, а в Linux - нет? Ну и в Linux собственно тоже, если нет зависимости от libstdc++, а также если libc 6-й версии API, а не 5-й, например. Мне кажется, это сделали для того, чтобы пользователи не стонали от первого из того, что я перечислил, и не считали это самым страшным злом в Linux.
P.S. Пока я делаю именно так, как в большом абзаце. Если не компилится в старом GCC то способ без мучений, а если компилится - пакетирую и ссылку в открытый доступ.