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)

В следующем выпуске - «Как пользоваться вилкой», «Как не убить себя при моргании» и по многочисленным просьбам наших любимых зрителей из тёплых стран - «Как правильно подтираться»

dogbert ★★★★★
()

Мда, сборка бинарников под неизвестный дистр Линукс - не самое благодарное занятие.

Deleted
()

Бинарники под Линукс распространяются в форматах .rpm .deb .tgz etc строго под определённый дистрибутив. Пора бы это знать. Трудно найти большего идиотизма, чем пытаться создать универсальный бинарь под Линукс. А вот такие советы >>>> Линкуйте её через dlopen(), блин! >>> - это называется профнепрегодность без надежды на переучивание. Иди в руководители лучше, пейши бумагу, пили бюджеты, «гуру». И денег больше заработаешь, и пользы принесешь.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 2)
Ответ на: комментарий от watashinoshi

Тут подход очень простой - просто собирай под самый старый дистр, насколько это возможно. И всё равно это так себе способ - проблемы начинаются с аддонами, интеграцией, и прочая борода. Это вам не венда, товарищи. Тут либо в исходниках распространяй, либо пакет под каждый дистр.

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

> ставить бинарники не от мейнтернеров, а от Васяна?

Есть такая штука, как официальный бинарь от разработчиков софта.

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

> это называется профнепрегодность без надежды на переучивание

Ну вот тебе несколько примеров обратного:

  1. libSDL использует dlopen() вообще для всего. Сделай ldd, а потом strings filename | grep lib. То же самое libOpenAL
  2. Adobe Flash Player слинкован статически только с иксовыми либами, GTK-либами, libjpeg, libpng и libasound2. Через dopen() он слинкован с libhal - а представь что было бы, если бы динамически? А также с libvdpau - чтобы конфигурации Intel и AMD не страдали
  3. Skype использует dlopen() для работы с libpulse.so.0. Даже после прекращения поддержи ALSA. У меня в Генте libpulse.so.0 нет, а скайп работает. А так бы он выдал «libpulse.so.0 not found». Отечественный мессенжер TrueConf это и выдаёт.
ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от conalex

>> Вот несколько моих советов.

> больше похоже на пожелания.

Печально осознавать, но да. По идее, так должны делать все. Но делают только большие мегакорпорации вроде Oracle, Adobe и Autodesk.

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

> Тут подход очень простой - просто собирай под самый старый дистр, насколько это возможно.

Да, именно! При этом можно даже не лишать себя удовольствия использовать самый новый компилятор! Раньше я боялся, что если я соберу что-нибудь в линуксе 5-летней давности, то в линуксе наших дней это не запустится: будет выдавать ошибки, неточности... Но я ошибался: обратная совместимость в линуксе - на высоте!

> Тут либо в исходниках распространяй, либо пакет под каждый дистр.

Вот таких ребят исчезающе мало :-(

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

Интересный топик,без подколок.

Но что делать Васянам, которые хотят написать прикладную программу, при этом не имея ни малейшего понятия про(за) библиотеки, LSB, какие-то там lib*.so системные, а всецело полагаются на.. Лазарус, например?

И если в рамках Лазаруса «прикладного погроммиста» еще можно как-то удержать от растеканием мыслью по системному древу /, то в овернавороченных средах - вообще не понятно как делать дистрибутив программы.

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

Ты ведь хочешь выразить, щто эти криво портированные с венды чудовища - образец программистского искусства и расово верного подхода ? Я не соглашусь с тобой в этом. По моему скромному мнению, этот твой список - список кривой блевотины, и так, как сделано у них, делать нельзя никогда.

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

Я так думаю что надо как-то причёсывать свою ЦА, собирая пакеты для мейнстрима LTS, пусть будет текущий релиз Федоры, ЦентОСи и Убунты.
Как минимум 3 дистра. Не считая ОпенЗюзю, под которой все разрабатывается :-)

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

В 2003-м году собирали под RH9 и mdk10. Так и выкладывали на все официальные сайты всех прог. А потом что-то вдруг изменилось, бинарники перестали выкладывать, стали выкладывать только исходники.

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

обратная совместимость в линуксе - на высоте!

Если только на уровне int 80, ога.

Вот таких ребят исчезающе мало :-(

А разве есть Линукс кроме убунту ? Щто-то я там слаки не увидел, хех.

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

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

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

Но что делать Васянам, которые хотят написать прикладную программу, при этом не имея ни малейшего понятия про(за) библиотеки, LSB, какие-то там lib*.so системные, а всецело полагаются на.. Лазарус, например?

Идти н@ из профессии.

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

>> обратная совместимость в линуксе - на высоте!

> Если только на уровне int 80, ога.

Это мой бинарь PCSX2 1.4.0, собирал в CentOS 5 2007 года компилятором 2015-го. Все, кто пробовал, хвалят, на нестабильность работы не жалуются. А официальная сборка хрен пойми в каком дистре собрана, требует libglew такой версии, которой ни в Ubuntu LTS, ни в последней нестабильной нет. А вот Dosbox-daum

> А разве есть Линукс кроме убунту ?

Valve тоже так думали, а потом таких проблем отхватили, что свалили на Debian

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

Valve просто обоср@лись баллмеровского магаза, начали метаться и истерить. Набрали мальчиков с помойки, но не для того, чтобы сделать нормально, а для того, чтобы шантажировать МС, они им и налабали блевотину на коленках, но быстро, вот и всё знание, как компильнуть правильно.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 2)
Ответ на: комментарий от lenin386

Да?

Чувак точит болванки на станке в гараже. Накопил опыт и у него есть пачка типовых алгоритмов. Допустим у него есть ВО и он прекрасно понимает к чему у компьютеров мышка с Ёкселем подключается, а за Дельфи еще в универе слышал и писал.

Ему тоже проследовать, серьезно? А может поделиться деньгой с настоящим хипстером, который меньше 5000ойро не берет?

Deleted
()

GLIBC_2.23 not found
GCC 4.9 минимум
GCC 4.8
GCC 4.4
GCC 6

Что это за зоопарк вымерших животных у вас?

На FreeBSD 11-STABLE ради прикола 99% установленных пакетов пересобрал с помощью GCC8-devel, указав пути к компилятору в /etc/make.conf и прописав подстановку библиотек времени выполнения в /etc/libmap.conf. Всё работает!

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

«Как правильно подтираться»

Камешками же, как в Коране написано.

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

Например разработчики RealPlayer не знали этих советов, и компилировали свой продукт в GCC 3. Шли годы, вышел GCC 4.0 и 4.1, а они продолжали пользоваться GCC 3, чтобы продукт имел совместимость с самым широким спектром дистрибутивов Linux. А потом почему-то прекратили поддержку Linux. А ведь можно было использовать наиболее текущую версию компилятора, и совместимость со старым Linux не терять.

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

Да?

Да.

Чувак точит болванки на станке в гараже. Накопил опыт и у него есть пачка типовых алгоритмов. Допустим у него есть ВО и он прекрасно понимает к чему у компьютеров мышка с Ёкселем подключается, а за Дельфи еще в универе слышал и писал. Ему тоже проследовать, серьезно?

Ему - в первую очередь.

А может поделиться деньгой с настоящим хипстером, который меньше 5000ойро не берет?

Может поделиться, может пообщать, вариантов стимулирования сотрудников масса, об этом и книжки и есть, и курсы в солнечных Сочи и Грециях - на выбор.

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

Флеш и скайп это бичи десктоппной софтвари - некоторым и без них тяжко, и с ними никак. Ставить их как положительный пример для защиты своей точки зрения это последнее дело.

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

API далеко не самый удобный, но он хотя бы на самом деле функционировать может, в отличие от.

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

Тяжёлый слишком,

Тяжесть - всегда цена кроссплатформенности. На самом деле, не такой уж и тяжёлый. Для эмбеддеда современного нормально даже. Кресты ONLY - да, плоховато. Но сейчас всё идёт к тому, что о сишечке в прикладном ПО будет забыто навсегда. Посмотри на ондроед, IOS - где там сишечка ?

на крестах и собирается несколько часов? Нет уж.

А зачем его вообще собирать.

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

Тяжесть - всегда цена кроссплатформенности.

SDL не менее кроссплатформенный. И единственное из прикладного ПО на моём компе, написанное на крестах (кроме midori) это nitrogen, который я всё равно выпилил в пользу hsetroot.

watashinoshi
()

Все зависит от софта. Но в конечном итоге лучше собирать под каждую конкретную версию дистрибутива. А портабельные версии оставь для оффтопика. Лишние же зависимости лучше наоборот избегать, и если уж очень хочется включить, то предоставлять как recommends или suggest.

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

Спасибо за поддержку :-) Я ностальгирую по тем временам, когда выкладывали бинарник для rh9 и mdk10, и всё, и больше ничего не надо. 90% открытого софта тогда можно было скачать официально, и оно работало. В т.ч. под Альтом и прочими не-RH. А теперь есть Default Linux Ubuntu, бинарники для которого не факт что запустятся в Альте, да и даже в Ubuntu другой версии... Вот и перестали собирать. Далеко не у всех есть хотя бы PPA.

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

Я только привёл пример удачного и правильного использования dlopen(). Не удивительно, что этот вызов применяют в проприетарном ПО, которое, в отличие от открытого, не пересоберёшь в случае чего. А то, что сами проги, по твоему мнению, не очень, не отменяет того, что dlopen() применили хорошо и правильно. Это как сказать «фильм Пашки Гринёва - не очень, потому что внешне он урод».

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

Фигли там удачно-то ? dlopen - это функционал в принципе не для этого. Это для отключаемого функционала в ПО. Допустим для плагинов, допустим ещё пример такая экзотическая задача : тебе надо гарантировать, что некоторый код в некоторой конфигурации не запустится никогда, в принципе не может. Ты его оформляешь в виде библиотеки и не грузишь, если не надо. Вот для чего это. А для обеспечения запуска на разных дистибутивах dlopen - это же костыли костыльные. Товарищ, это всё элементарные сведения, за услуги копетана очевидность платить надо-бы. Перечисли-ка мне 400 ойро.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 3)
Ответ на: комментарий от lenin386

Походу ты там оголодал, то тебе левые пойти на@ должны, то 400ойро за консультацию на форуме...

Deleted
()

момент убунте

На убунте вообще канпелируют дебилы, нормальные люди пользуются ppa.

бинарник 2GIS

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

CentOS 6

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

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

Короче абанта — наша все!!1

Одно портит убунту это .деб. Впрочем ни один пакетный менеджер эргономикой особо не блещет в линуксе.

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

Ну а чо, всю динамику в ./lib, включая libc, и LD_LIBRARY_PATH на этот каталог. В итоге имеем монстров типа Xilinx ISE/Vivado, которые жрут места больше, чем WoW со всеми аддонами.

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

Наркоман красный штоль, деб — это формат. А пакетный менеджер там — apt-get.

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

Где сишка, там и в остальные языки биндинги на раз, а с крестами такое уже не катит.

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