Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Локальная библиотека в программе на Qt  (Прочитано 631 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
Здравствуйте!

Возможно ли в программе на Qt подключить библиотеку не из системного каталога, а из своего?
Программа находится в каталоге /home/user/prog, библиотека liblib.so со своим исходным кодом в /home/user/prog/lib,
в pro-файле её каталог и она указаны через опции -L/home/user/prog/lib -llib,
в /home/use/prog/lib я ввёл команду
/sbin/ldconfig -v -n -r /home/user/prog/lib -l liblib.soона создала ссылку, но при запуске программа библиотеку не находит.
В кэш библиотека, конечно, не заносится, но ведь в "man ldconfig" сказано, что она может запускаться от пользователя?
М.б., я указал не тот каталог с опцией "-r"?

Вообще как достичь желаемого?

Пользователь добавил сообщение 09 Февраль 2018, 15:11:13:
Я попробовал сделать правильно:
в каталоге /home/user/prog/lib создал каталоги etc и lib, в lib поместил liblib.so,
в etc создал файл ld.so.conf из одной строки - /lib и в /home/user/prog/lib вызываю ldconfig командой:
/sbin/ldconfig -v -r `pwd` -n /libхотя "-n /lib" теперь должна быть лишней, опять же в /home/user/prog/lib/lib ссылки создаются, но ld.so.cache нет.
Правда, я видел в Интернете утверждение, что локальный cache подключить не удастся, но всё равно - почему он не строится?

Мне в другом месте подсказали опцию линковщика "-rpath", но всё равно сначала надо создать cache.


Пользователь добавил сообщение 09 Февраль 2018, 15:39:16:
cache построился, когда я убрал опцию "-n /lib". ldconfig пожаловалась, что нет других предопределённых каталогов,
но etc/ld.so.cache построила.

Пользователь добавил сообщение 09 Февраль 2018, 16:57:50:
У qmake есть опция "-cache <cache-file>". Я включил в pro-файл свою библиотеку и путь к ней через "-l" и "-L"
и вызвал qmake так:
qmake -makefile -cache lib/etc/ld.so.cache prog.proMakefile создался содержащий этот cache в строке
Makefile:
но всё равно ld эту локальную библиотеку не находит, а почему?
QMAKE_LFLAGS ещё не наращивал.

Пользователь добавил сообщение 09 Февраль 2018, 18:55:24:
Я спросил и тут же обнаружил, почему, но исправить смогу только в понедельник.
Я запускал ldconfig с параметром "-r <dir>" и библиотеку поместил в dir/lib,
а ldconfig отсчитывает пути от корня - "/", соответсtвенно и в моём ld.so.cache путь был /lib,
т.е. ld искал эту библиотеку в настоящей /lib.
Я попробую воспроизвести в <dir> структуру домашнего каталога, т.е., например, home/user/lib,
тогда, надеюсь, и ld будет искать мою библиотеку в /home/user/lib.
« Последнее редактирование: 09 Февраль 2018, 19:00:30 от Peter_I »
Пётр.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
Re: Локальная библиотека в программе на Qt
« Ответ #1 : 12 Февраль 2018, 17:52:24 »
Я попробовал, оказалось, что вышеописанного недостаточно, хотя адрес локального ld.so.cache и вставляется в Makefile.
Надо добавлять в pro-файл флаг QMAKE_RPATHDIR, вот скрипт, который создаёт ld.so.cache:
(Нажмите, чтобы показать/скрыть)
Пётр.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
Re: Локальная библиотека в программе на Qt
« Ответ #2 : 14 Февраль 2018, 18:11:20 »
Теперь непонятно, как работает ld. Если я поместил свою библиотеку в /usr/local/lib и в pro-файле, кроме её самой,
указал путь к ней опцией -L/usr/local/lib, то ему всё равно надо, чтобы она была в /etc/ld.cache, т.е. требуется
запуск ldconfig от root.
Если же я помещаю её в $HOME/home/user/lib и так же подключаю её в pro-файле, а Makefile создаю командой
qmake -makefile -cache $HOME/etc/ld.so.cache <pro-file>то этот адрес локального кэша помещается в Makefile, но ld его не видит, требуется в pro-файле добавлять
путь к библиотеке с помощью другой опции:
QMAKE_RPATHDIR += /home/user/libтогда в Makifile появляется в явном виде опция для ld:
Wl, rpath, /home/user/lib
Я не пробовал в виде эксперимента делать то же самое для /usr/local/lib.
Т.е. в одном случае для ld требуется, чтобы библиотека была в системном кэше,
а локальный кэш он игнорирует и требуется rpath. В "man ld" слова "cache" вообще нет.
А можно ли как-нибудь указать ld, чтобы он читал и локальный кэш?
Есть же зачем-то у qmake опция "-cache"?
Пётр.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
Re: Локальная библиотека в программе на Qt
« Ответ #3 : 15 Февраль 2018, 21:29:30 »
Мне подсказали ещё один вариант подключения своей библиотеки - с установкой LD_LIBRARY_PATH.
Я о ней знал, но я думал, что её должен устанавливать root, нет, говорят, и пользователь может.
Действительно, с ней работает и без QMAKE_RPATHDIR, а локальный кэш не используется в любом случае,
т.е. опция qmake "-cache", хотя и помещает его в Makefile, не делает его доступным для ld.
Причём она не устанавливется в ~/.profile, как у меня две другие, устанавливается в ~/.bashrc.
Пётр.

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7064
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Локальная библиотека в программе на Qt
« Ответ #4 : 15 Февраль 2018, 21:53:32 »
Я встречал практику делать скрипт для запуска и прописывать туда LD_LIBRARY_PATH

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
Re: Локальная библиотека в программе на Qt
« Ответ #5 : 16 Февраль 2018, 00:08:26 »
Разумеется, можно и так. Там человек и предлагал как вариант устанавливать на время сессии.
А что будет, если эта переменная уже установлена в системе?
Попытка пользователя проигнорируется или переменная заменится?
И что происходит с переменной окружения, установленной пользователем, после его выхода из системы?
Пётр.

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7064
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Локальная библиотека в программе на Qt
« Ответ #6 : 16 Февраль 2018, 14:45:47 »
Peter_I, перезапишется, при том только в рамках той сессии, в рамках которой её запустили.

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 713
    • Просмотр профиля
Re: Локальная библиотека в программе на Qt
« Ответ #7 : 20 Февраль 2018, 12:03:38 »
А что будет, если эта переменная уже установлена в системе?

Обычно в bashrc прописывают так
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my/path

Т.е. как с PATH, через двоеточие дописываются пути

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
Re: Локальная библиотека в программе на Qt
« Ответ #8 : 20 Февраль 2018, 14:44:59 »
aSmile, Я хотел было так сделать, но на там компьютере заведомо нет и не будет системной LD_LIBRARY_PATH.
Ещё оказалось, что, если я устанавливаю её в ~/.bashrc, а из ~/.profile или из ~/.config/autostart запускается
скрипт с запуском программы, которой эта переменная нужна, то она не успевает установиться и я внес её установку
в скрипт с запуском программы.
Пётр.

 

Страница сгенерирована за 0.078 секунд. Запросов: 24.