Нулевой handle при загрузке динамической библиотеки

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Нулевой handle при загрузке динамической библиотеки

Сообщение gluhow » 22.09.2016 15:14:00

Здравствуйте, столкнулся со следующей проблемой:
у меня есть проект на с++ с использованием библиотек от qt, который компилируется в динамическую библиотеку. Эта библиотека подключается и используется у меня в программе. Если при при компиляции библиотеки указываю пути qt4, то SaveLoadLibrary выдает нормальный handle, если указываю пути qt5, то компиляции по-прежнему происходит без проблем, но SaveLoadLibrary возвращет 0.
Почему функция может выдавать ноль? Путь до библиотеки прописан правильный. Разрядность библиотеки соответствует программе.
Проблема точно не в QT, т.к. только вчера имел точно такую же проблему в зависимости от включения/выключения .c файла, в котором особо ничего подозрительного и не было.
Система Linux 4.6.0-1-amd64 #1 SMP Debian 4.6.4-1 (2016-07-18) x86_64 GNU/Linux
Lazarus 1.7 SVN:51765
Free Pascal Compiler version 3.1.1 [2016/09/06] for x86_64
Может быть это только у меня так? Кто нибудь может на Линухе проверить линкуется с библиотекой или нет? В приложении libtex_test.so.4, libtex_test.so.5 соответственно qt4, qt5.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
gluhow
новенький
 
Сообщения: 41
Зарегистрирован: 13.08.2015 15:30:20

Re: Нулевой handle при загрузке динамической библиотеки

Сообщение Cheb » 16.10.2016 04:19:13

Не знаю связано ли в данном случае, но в линуксе бывает, что библиотека ожидает от екзешника, что он слинкован с какой-то ещё библиотекой и пытается получить от него адреса функций.

Давно сталкивался, позабыл почти всё, цитирую с своей домашней страницы:

http://chebmaster.ru/cge/cge.html , пост от августа 2008-го
Я плюнул, переделал тот юнит вампыра под динамическую загрузку, нашёл libopenjpeg.so, и стал грузить её. А она не грузится! dlopen() не срабатывает, и всё. Полез за объяснениями в dlerror(). Та сообщила, что не найден символ Floor. Полез в гугль. Получил: моя программа слинкована без сишных библиотек. Первый раз встречаю такую хрень, чтобы длл что-то ожидала найти в екзешнике %(

Стал рыть Инет дальше, и узнал о дополнительном параметре для dlopen()

Если упрощённо, то
dll2:= dlopen(PChar(libstdc++.so.5), RTLD_NOW or RTLD_GLOBAL);
dll := dlopen(PChar(libopenjpeg.so), RTLD_NOW or RTLD_GLOBAL);

И вот это RTLD_GLOBAL заставляет дллы искать у друг дружки недостающие зависимости.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

Рейтинг@Mail.ru