LINUX.ORG.RU

Как поступать с динамическими библиотеками?

 , , , ,


0

2

В общем ни разу не писал чего то на плюсах под линуксы, всё ява. Собственно не понимаю...

Написал я приложение на ubuntu 14.04, основываясь на библиотеках из его репозитория: boost (asio, filesystem, log, property tree), pugixml, libmysqlcppconn

Значит работает, всё нормально. Но надо сделать чтоб оно работало под 12.04 LTS. Слинковал статически boost, запускаю, а оно мне пишет, что glibc не тот.

Как вообще в этих линуксах поступать с зависимостями по библиотеками?

★★★★★

Компиль приложение всегда под старыми дистрибутивами. Собранные со старой версией glibc приложения запустятся на более новых glibc. Наоборот - нет. Библиотеки, у которых нестабильный ABI, или которые часто отсутсвуют в установках дистрибутива или линкуй статически, или поставляй с приложением и загружай с помощью LD_LIBRARY_PATH через враппер-скрипт.

omnomnomnus
()

Собирай с glibc из 12.04 (например, с помощью Docker).

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

ты можешь собрать свежий буст из сорцов практически под любой дистриб. ну, конечно, если там не совсем уж древний компилятор.
проблема в том, что не всё можно собрать статически. но кое-что можно.
чтобы он тебе glibc включил в него, есть опция для линкера -static-libgcc. иногда ещё нужен -static-libstdc++. можно почитать про эти опции тут: https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

Iron_Bug ★★★★★
()

Собери на 12.04 - boost статикой, glibc динамикой.

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

А что, systemd с jounrnald его уже вошли в LSB? Или каждый уважающий себя программист должен тянуть с собой свой велосипед, который занимается журналированием?

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

А что, systemd с jounrnald его уже вошли в LSB?

надеюсь, что и не войдут никогда

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

boost.log - это вообще наркомания!

А что, systemd с jounrnald его уже вошли в LSB? Или каждый уважающий себя программист должен тянуть с собой свой велосипед, который занимается журналированием?

facepalm.jpg

Причем здесь вообще systemd и journald?

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

Как следование LSB vN поможет с дистрами, которые совместимы только с LSB v(N-M)?

Никак. Но следование LSB v(N-M) обеспечит совместимость с LSB vN (в теории).

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

Никак. Но следование LSB v(N-M) обеспечит совместимость с LSB vN (в теории).

Как раз в последней редакции они Qt3 выпилили :).

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

у буста некоторые вещи идут шаблонами/макросами без сопутствующих библиотек так что не удивительно

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

просто обычно этого хватает для того, чтобы системы на бинарник не ругались. можно слинковать с libc.a напрямую, если не хватает стандартных флагов линкера.

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

в линуксах ничего статически линковать не надо.

boostlog и pugixml отсутсвуют в ubuntu 12.04

Короче слинковал статически boost, pugixml, а на динамику оставил всякие там libmysqlcppconn, lcrypto

В процессе переноса наткнулся на то, что компилятор gcc в ubuntu 12.04 не взлюбил ещё c++11, пришлось переписывать кое-чего. Что тут сказать... #ILoveCPP во все дыры.

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

ну, так-то да. я как-то не парюсь на этот счёт. я - за опенсорц.

Ну и свободные лицензии тоже могут быть несовместимы друг с другом.

proud_anon ★★★★★
()

Париться за динамическую линковку в эпоху, когда софт деплоится в виде docker-контейнеров?

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

Никак. Но следование LSB v(N-M) обеспечит совместимость с LSB vN (в теории).

Нихрена оно не обеспечит. Во-первых, уже сказали, что в новом LSB Qt3 убрали. Во-вторых любое отличие от LSB — и программа уже не запустится; к примеру, в выпуске OpenSUSE двухлетней давности нет libpng12, требуемой по LSB с хрен знает какого года. В-третьих, всё равно придётся собирать со старой GLIBC. В-четвёртых, интеграции с системой всё равно толковой не будет от одного лишь соблюдения LSB.

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

обновить, не?

Только если clang, потому что вместе с GCC обновляется библиотека libstdc++ (которая у другого пользователя обновлена не будет). Ни Ubuntu, ни какой-либо другой дистрибутив не обеспечивают для C++ достойной обратной совместимости, ну разве что если всё с собой таскать в пакете с приложением.

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

обновить, не?

В Linux вообще нет такого понятия как «SDK для платформы» и «компиляция проекта под платформу». В Visual Studio можно спокойно выбрать для сборки проекта платформу vc120+XP, в которой будут все возможности стандартной библиотеки из VS2013 плюс весь WinAPI, совместимый с XP и выше. В MacOSX, iOS, Android NDK есть такое же. В Linux нихрена нету.

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

а на динамику оставил всякие там libmysqlcppconn

Если собрал для MySQL 5.5, то, скажем, с MySQL 5.1 работать не будет.

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

Во-первых, уже сказали, что в новом LSB Qt3 убрали.

Да, убрали. Это и меня удивило. Но это ещё не причина отказываться от LSB, поскольку Qt3, скажем честно, на момент добавления уже была сильно устаревшей.

Во-вторых любое отличие от LSB — и программа уже не запустится;

В дистрибутиве, соответствующем LSB, не должно быть отличий от LSB.

к примеру, в выпуске OpenSUSE двухлетней давности нет libpng12, требуемой по LSB с хрен знает какого года.

Это в какой версии? Потому что даже в OpenSUSE 12.1 пакет lsb зависит от libpng >= 1.2.

В-третьих, всё равно придётся собирать со старой GLIBC.

LSB SDK поставляется со своими .so. Они там не настоящие, а только содержат нужные интерфейсы для линкера.

В-четвёртых, интеграции с системой всё равно толковой не будет от одного лишь соблюдения LSB.

Что ты понимаешь под интеграцией в систему?

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

В Linux вообще нет такого понятия как «SDK для платформы» и «компиляция проекта под платформу».

Представляешь, в LSB SDK именно так и есть.

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

В Linux вообще нет такого понятия как «SDK для платформы»

qt вполне подходит под определение. ставишь — качается всё что нужно для разработки под qt под линукс, включая документацию.

next_time ★★★★★
()

99,9% программ зависят от Libc (Glibc). Glibc 2.20 имеет обратную совместимость с 2.19, а наоборот - нет. вывод очевиден: тебе необходим наиболее старый Glibc! Если ты скомпилируешь с версией 2.4, то и в 2.20 всё будет работать!

Напиши мне в Jabber: Zenitur@jabber.ru! Я тебе так скомпилирую, что будет работать везде! Для этого у меня есть CentOS 5 2007 года выпуска, и компилятор 2014-го.

ZenitharChampion ★★★★★
()

А самый простой путь — за-GPL-ить и выложить просто исходники и пакеты динамически слинкованные с зависимостями для популярных дистров, видимо, для слабаков.

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

To see this problem in action, let’s consider the following little snippet of code which uses a C++11 only function

не делайте так, только и всего

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