Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распространение программ и разделяемые библиотеки, где размещать бибилотеки? 
:(
    Опции темы
quarz
Дата 21.12.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



Здравствуйте!

В линуксе я пока новичек, программировал до этого под windows. А тут встала необходимость сделать порт Qt-шной проги под линукс и мак.
Моя программа распространяется без исходников и использует разделяемые библиотеки. 
Вопрос: где их размещать? В windows, например есть практика все используемые dll хранить в директории с установленной программой. 

Вот сейчас я скомпилировал свою программу, запускаю - она говорит "не найдена такая-то библиотека xxxxx.so", хотя этот файл лежит в каталоге с бинарником! А вот если его скопировать в /usr/local/lib или в /usr/lib - то запускается нормально. Почему так? Это я на этапе сборки в файле проекта указал не те пути откуда брать библу (и теперь бинарник хочет подключать ее непременно из того каталога), или так и должно быть?

Еще один вопрос про имена. Я в проекте подключаю библиотеку "-lqwt", а сам файл называется libqwt.so. Откуда система знает, что искать нужно не qwt.so, а libqwt.so ?
И еще, чем различаются .so, so.0, so.5 .. ? Ту же libqwt.so, например, линкер требует еще в варианте libqwt.so.5, хотя эти файлы идентичны (libqwt.so.5 я делал как символьную ссылку на libqwt.so)

Помогите разобраться!
PM MAIL   Вверх
djamshud
Дата 21.12.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>Вопрос: где их размещать?

В /usr/lib например

>В windows, например есть практика все используемые dll хранить в директории с установленной программой.

И основной профит от использования dll пропадает

>Откуда система знает, что искать нужно не qwt.so, а libqwt.so ?

Так уж повелось, что libsome.so

>И еще, чем различаются .so, so.0, so.5 .. ?

Просто версии так именуют.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
MAKCim
Дата 21.12.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(quarz @  21.12.2009,  15:32 Найти цитируемый пост)
Почему так?

стандартный путь поиска библиотек компоновщиком
используете переменную среды LD_LIBRARY_PATH
Код

# export LD_LIBRARY_PATH=./
# ./<program>


Цитата(djamshud @  21.12.2009,  15:43 Найти цитируемый пост)
И основной профит от использования dll пропадает

не всегда _конкретной_ программе нужна общая версия либы из /usr/lib ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
djamshud
Дата 21.12.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



MAKCim, не всегда, но обычно софт кладет либы именно туда.

quarz, если же нужно обязательно держать библиотеку рядом с самой программой, лучше имхо просто правильно слинковать:
Код

g++ -L. -Wl,-rpath,. <flags> <obj-files> <libs> -o <proga.exe>


Upd:

Это, если рабочим каталогом будет тот, где proga.exe лежит.

Иначе так:
Код

-L/path/to/proga.exe -Wl,-rpath,/path/to/proga.exe


Это сообщение отредактировал(а) djamshud - 21.12.2009, 16:49


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
MAKCim
Дата 21.12.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(djamshud @  21.12.2009,  16:43 Найти цитируемый пост)
MAKCim, не всегда, но обычно софт кладет либы именно туда.

либа и есть софт ;)

ну и, собственно говоря, смотря как происходит инсталляция


Цитата(djamshud @  21.12.2009,  16:43 Найти цитируемый пост)
если же нужно обязательно держать библиотеку рядом с самой программой, лучше имхо просто правильно слинковать:

в чем преимущество?
любое неоправданное статическое ограничение есть суть зло


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
quarz
Дата 21.12.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



А чем различаются каталоги /usr/lib и /usr/local/lib ? Я прально понимаю, что в /usr/lib хранятся системные библиотеки, а в /usr/local/lib - пользовательские?
PM MAIL   Вверх
djamshud
Дата 21.12.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



MAKCim, не придирайтесь, все поняли о чем, правда?smile

>в чем преимущество?

Преимущество _имхо_. Субъективно, мне просто кажется более правильным, когда софт сам о себе заботится, без всяких дополнительных обвязок в виде скриптов.


quarz, системные в /lib, в /usr/llib програмы, поставленные штатным образом дистрибутива, /usr/local/lib - самособранные и прочие левые. Разделение весьма условно, я например /usr/local вообще не использую.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
quarz
Дата 21.12.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



То есть, откуда будет брать билиотеку линкер, в том же каталоге и будет искать бинарник?
PM MAIL   Вверх
djamshud
Дата 21.12.2009, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



В общем, вот достаточно простое и иногда используемое решение. Размещайте бинарник(и) и библиотеки в /opt/progname. И линкеру говорите, что я там писал, только /opt/progname. Потом в /usr/bin положите симлинк на вашу программу, и она будет работать.

Положите - я имею в виду, установочным скриптом, конечно. Пользователь за вас этого всего делать не станет.:)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
MAKCim
Дата 22.12.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(quarz @  21.12.2009,  19:23 Найти цитируемый пост)
То есть, откуда будет брать билиотеку линкер, в том же каталоге и будет искать бинарник? 

все зависит от того, как вы запускаете программу и какой интерпретатор используюте
обычно пути поиска описываются переменной среды PATH


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
quarz
Дата 22.12.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



А что делать линкеру в путях переменной PATH ? Там же только каталоги с исполняемыми программами. Вот, например, мой path:
/home/alex/develop/Qt64/qt/bin:/usr/lib64/mpi/gcc/openmpi/bin:/home/alex/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin

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

Уже вроде все варианты перепробовал, не помогает. Линкуется беp ошибок, а при запуске не находит библиотеки, приходится их кидать в /usr/lib64 иkb в /usr/local/lib64  (у меня х64 система и собираю под нее. Но проблема точно не в этом, под х86 было то же самое)

Вот часть pro файла, может я тупо слэш пропустил, или не тот путь указал? Проверьте, плиз.

Код

TEMPLATE = app
TARGET = XILab
DESTDIR = ./release
CONFIG += release
INCLUDEPATH += ./GeneratedFiles \
               ./GeneratedFiles/release \
               ./src \
               ./../Qt64/qt/include \
               ./../qwt-5.2.0/src \
               ./../xidcusb-0.9.0
LIBS += -L"/home/alex/develop/XILab/release" \
        -lxidcusb \
        -lqwt \
        -lftd2xx \
        -lQtCore \
        -lQtGui
DEPENDPATH += .
MOC_DIR += ./GeneratedFiles/release
OBJECTS_DIR += release
UI_DIR += ./GeneratedFiles
RCC_DIR += ./GeneratedFiles
include(XILab.pri)


Я тут в путях линкера даже абсолютный адрес указал к скомпиленному бинарнику, там же и лежат все либы. Собирается без ошибок! А при запуске - 
./XILab: error while loading shared libraries: libxidcusb-0.9.0.so: cannot open shared object file: No such file or directory
PM MAIL   Вверх
djamshud
Дата 22.12.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



Код

LIBS += -L"/home/alex/develop/XILab/release" \
        -Wl,-rpath,/home/alex/develop/XILab/release \
        -lxidcusb \
        -lqwt \
        -lftd2xx \
        -lQtCore \
        -lQtGui


должно помочь.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
quarz
Дата 22.12.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



Спасибо, действительно теперь бинарник начал искать библиотеки в каталоге rpath. Изменил на 
-Wl,-rpath,./ \
чтобы при запуске бинарника он искал библы в своем каталоге. Но есть странность. Если запускать из консоли - запускается, а если кликнуть по бинарнику мышкой - не запускается, как будто не нашел библиотеки! 

Для rpath перепробовал "." "./" с кавычками и без, результат одинаковый. Такое чувство, будто при клике мышкой не определяется текущая директория где лежит бинарник

Это сообщение отредактировал(а) quarz - 22.12.2009, 16:37
PM MAIL   Вверх
quarz
Дата 22.12.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



Пошлю я, наверное, этот win-style к черту, скопирую все библиотеки в /usr/lib/my_prog и не будет проблем
PM MAIL   Вверх
quarz
Дата 22.12.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 7.1.2005

Репутация: нет
Всего: 3



всетаки странно получается. При сборке для линкера я свои библиотеки могу положить куда угодно, и рпедупредить его об этом опцией -L, а бинарник все равно будет искать свои библы в стандартных путях?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0620 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.