LINUX.ORG.RU
ФорумTalks

Рекомендации по сборке бинарников под Linux

 , ,


3

2

Немаловажно при сборке бинарников - приготовить правильное сборочное окружение. Не настолько важно, как написание портабельного кода, но тем не менее. Вот несколько моих советов.

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), причём с несколькими версиями сразу. Я не знаю как.

★★★★★

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

Ответ на: комментарий от Ygor

бинарник 2GIS

Издохло давно, даже под виндовсь.

месяц назад качал для виндовсь

http://info.2gis.ru/moscow/products/download#skachat-kartu-na-komputer

Странно, для Linux там тоже всё ещё есть :

http://info.2gis.ru/moscow/products/download#skachat-kartu-na-komputer&linux

даже база для Москвы.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)

Интересные рекомендации, спасибо.

В идеальном мире разработчики должны делать именно tar.gz-образы рабочих программ, из которых уже мейнтейнеры будут делать всякие deb/rpm/ebuild/pkgconfig и прочий зоотреш.

Кроме того, недавно появился новый вариант распространения программ под Linux — компактный AppImage. Скачал, chmod +x, запускай и работай.

// в треде опять шитпостинг от ленина, надеюсь модераторы когда-нибудь пнут его под зад

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

В начале 10-х программисты 2GIS обеспечили работу в Wine, подготовив специальную версию без того, что не работает в Wine. Требовалась версия 1.2 минимум. Два года назад вышла официальная версия для Linux. Должно было произойти крупное обновление 2GIS на всех платформах. Но крупное обновление было приостановлено, в т.ч. для Windows. Поэтому для скачивания по-прежнему достпуна специальная версия для Wine.

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 1)

Рекомендации очень полезные, только может попробуешь тоже самое на habr выложить (может с дополнениями, чтобы на пост потянуло). Шансов, что кто-то заметит или после случайно нагуглит будет куда больше.

Вообще, разумеется любой нормальный линуксойд попробует скачать нужный ему софт из репозитория. Если там нет, пойдет скрепя сердцем искать сторонние репо и только потом уже очередь дойдет до таких вот «бинарников» от разработчика. Мне бы хотелось, чтобы это последнее звено в цепи работало, как запасной вариант. Что тут плохого?

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