LINUX.ORG.RU
ФорумTalks

glibc


0

1

компиляция программы из исходного кода - процесс сложный. Оптимизация может не проводиться, а может проводиться под какой-либо процессор из серий 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 то способ без мучений, а если компилится - пакетирую и ссылку в открытый доступ.

★★★★★

Последнее исправление: ZenitharChampion (всего исправлений: 5)

И что?

Чем лучше виндовый механизм, по которому в DLL не обозначена версия и нельзя одновременно иметь в системе две версии одной DLL?

(И не надо мне говорить про .NET.)

reserved
()
Ответ на: комментарий от reserved

Для программиста он хуже, придётся поплясать с бубном, чтобы программа запускалась во всех версиях Windows. Для пользователя - лучше тем, что прочитал что есть игра, скачал и запустил.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

Проприетарщикам никто не мешает класть все нужные библиотеки в установщик. Даже больше скажу - они и в Винде так делают!!!11 Именно поэтому каждая программа на VC++какаятамверсия тянет в установщике свои msvcp90.dll т msvcr90.dll.

А для опенсорса есть дистрибутивы и пакетные менеджеры, где можно и пересобрать, если что.

reserved
()
Ответ на: комментарий от reserved

в DLL не обозначена версия и нельзя одновременно иметь в системе две версии одной DLL

А это что?

C:\Windows\system32>dir C:\Windows\System32\d3dx10*
 Volume in drive C has no label.
 Volume Serial Number is B8BD-DC8A

 Directory of C:\Windows\System32

29.11.2006  12:06           440 080 d3dx10.dll
15.03.2007  15:57           443 752 d3dx10_33.dll
16.05.2007  15:45           443 752 d3dx10_34.dll
19.07.2007  17:14           444 776 d3dx10_35.dll
02.10.2007  08:56           444 776 d3dx10_36.dll
05.02.2008  22:07           462 864 d3dx10_37.dll
30.05.2008  13:11           467 984 d3dx10_38.dll
10.07.2008  10:01           467 984 d3dx10_39.dll
10.10.2008  03:52           452 440 d3dx10_40.dll
09.03.2009  14:27           453 456 d3dx10_41.dll
04.09.2009  16:29           453 456 d3dx10_42.dll
26.05.2010  10:41           470 880 d3dx10_43.dll
              12 File(s)      5 446 200 bytes
               0 Dir(s)   8 078 925 824 bytes free

Deleted
()
Ответ на: комментарий от Deleted

Кстати, почему для openSuSE, например, ещё нет compat-libraries каких-нибудь, чтобы запускалось тупо всё, что когда-либо выходило для Linux? Я вижу несколько версий wxwidgets и всё того же libstdc++ (2 3 5 6). Не думаю, что это заняло бы больше 200-300 мегабайтов.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Свалка? В Linux такая же система, ".so.номер". Правда код открыт и можно хранить только одну версию, последнюю, как в Gentoo, и это не создаст проблем совместимости.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от reserved

Ну и я о том же... Первый абзац. Что это проблема есть и в Windows и решается бастро-быстро. Но glibc там нет.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

И что, в WinSxS тоже пытаются решить проблемы с C++?

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

Во FreeBSD нормально. максимум требуется установить пакет compat-xx с либами от нужной ветки фри.

Ygor ★★★★★
()
Ответ на: комментарий от ZenitharChampion

В Linux менеджер пакетов ставит все нужные либы, и чаще всего 100500 версий одно либы просто не нужно. А тут поставишь квип, а он тебе хоп и либу пихнул тихонько. И наслаждайся потом, если что не так.

Deleted
()
Ответ на: комментарий от Deleted

Это потому что проприетарный. Если QIP не сломает зависимости, и в /usr/lib будет и libpng12 (специально для QIP), и libpng14, я не буду против.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

А если другой подобное программе понадобится libpng12? С какими-нибудь другими опциями собранная. От тут то сказочка и расширится интересными подробностями. Хотя можно ещё сделать вида libpng12-qip.so :)

Deleted
()
Ответ на: комментарий от madcore

В репах нет, мой дистрибутив не поддерживается с 2009 года.

ZenitharChampion ★★★★★
() автор топика

Ставишь CentOS 5 (хоть в чрут), собираешь все в ней (можешь поставить из репов gcc 4.4), пакуешь бинарник со всеми либами, от которых он зависит, включая libstdc++. Все.

annulen ★★★★★
()

А ещё часто встречается такой код, который отказывается компилироваться в GCC младше 4.5 или даже 4.6...

Наверное это C++11

annulen ★★★★★
()
Ответ на: комментарий от annulen

А, забыл, при старте своей программы задаешь правильный LD_LIBRARY_PATH, скриптом например.

annulen ★★★★★
()
Ответ на: комментарий от juk4windows

Кроме дешёвых выкриков, есть что сказать?

УМВРЧЯДНТ? Хе-хе.

На эту страницу ссылается тысяч 10 страниц в инете. Наверное, не с проста.

У меня на жопе прыщ вскочил, наверно тоже, не спроста.

baverman ★★★
()

Сколько лет прошло, а DOS-way до сих пор остается Ъ — тащить все нужные драйвера и библиотеки вместе с игрой.

buddhist ★★★★★
()
Ответ на: комментарий от baverman

По ссылке все правильно сказано. Только вот это к любой современной ОС подойдет.

buddhist ★★★★★
()
Ответ на: комментарий от annulen

> Ставишь CentOS 5 (хоть в чрут), собираешь все в ней (можешь поставить из репов gcc 4.4), пакуешь бинарник со всеми либами, от которых он зависит, включая libstdc++. Все.

Мило, и с 8-гигабайтной игрой как раз вполне получится. А с uTorrent, который не занимает и мегабайта? Так Linux-версия эксклюзивно будет занимать 5 мегабайтов. uTorrent лучше взять и скомпилировать в Debian с GCC 4.1.1, и запустится тупо везде, и занимать будет меньше мегабайта, как для Windows.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

А с uTorrent, который не занимает и мегабайта? Так Linux-версия эксклюзивно будет занимать 5 мегабайтов.

Ну и пофиг, зато гарантированно будет работать. 5 метров - это вообще ничто по сравнению с размерами современных винчестеров.

annulen ★★★★★
()
Ответ на: комментарий от ZenitharChampion

На худой конец, слинкуй статически, если программа маленькая, экономия места может быть существенной.

annulen ★★★★★
()
Ответ на: комментарий от ZenitharChampion

Вы же вроде говорите, что вам не нравится, что у вас не идёт новая игра на старом glibc. Однако ничто не мешает обновить glibc, который явно не заброшен.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Это представляет технические трудности. Нужно обновить gmp (с ключом configure для что-то там C++), mpfr, mpc, ppl, cloog и GCC. Час чистой компиляции, и то если не будет проблем.

Легче скомпилить игру на старом GCC, входящем в мою систему. Работать будет точно так же, в чём я убедился на прмиере многих игр.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

Если используете не бинарный дистрибутив, то не надо возмущаться, что компиляция может отнимать много времени. Если не обновляете системные библиотеки, то не надо возмущаться, что у вас не идут новые игры (ибо не обновление библиотек, когда есть новые стабильные версии - ССЗБ). Так что всё логично и я не вижу ничего плохого.

KivApple ★★★★★
()
Ответ на: комментарий от annulen

WinSxS - это жуткий костыль, который ввели именно потому, что не существовало нормального механизма разрешения конфликтов DLL на уровне имён. Причём ввели только начиная с XP.

И оно не решает всех проблем. Может ли один процесс одновременно загружать две версии разной DLL?

reserved
()
Ответ на: комментарий от reserved

В 2000 тоже есть. Я Windows 2000 установил в виртуальную машину как раз из-за того, что в Wine после установки не появлялись все файлы ".manifest" в каталоге WinSxS, в Windows 2000 всё появляется, и я копирую оттуда и запускаю игры.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от reserved

Может ли один процесс одновременно загружать две версии разной DLL?

Две разные версии одной сошки тоже нельзя загрузить одновременно

annulen ★★★★★
()
Ответ на: комментарий от ZenitharChampion

libstdc++.so.6

Забудь об этой цифре. Разные подверсии 6 могут иметь мелкие несовместимости, которые могут всплфть в неожиданный момент.

annulen ★★★★★
()
Ответ на: комментарий от annulen

>> libstdc++.so.6

Забудь об этой цифре. Разные подверсии 6 могут иметь мелкие несовместимости, которые могут всплфть в неожиданный момент.

Читал такое в описании DooM III, где libstdc++.so.6 игры советуют не менять на более новый, в частности попросили не делать это гентушников. Да ничего подобного, нет этого, теория одна. Самый новейший libstdc++ всегда запускает все бинарники для libstdc++.so.6.

> Забудь об этой цифре.

А вот не забуду, у libc тоже цифра 6, но обратная совместимость сохранена. Значит это возможно, и более того, соблюдается у все остальных библиотек, более важных и менее важдых libstdc++. Меняли бы тогда что ли число на большее, раз совместимость со старой версией не сохраняют. Например, libstdc++.so.21 и симлинки на него 6, 7... И так далее. Правда тогда у этих разработчиков был бы соблазн и эту совместимость не соблюдать, о которой я написал в первом абзаце.

Теперь понятно, почему Деппер такой упёртый.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

Теперь понятно, почему Деппер такой упоротый.

fixed

prizident ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.