Russian Qt Forum
Ноябрь 23, 2024, 20:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: не грузится библиотека в Linux (MinGW работает)  (Прочитано 8918 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Ноябрь 23, 2010, 17:22 »

проект, созданный и отлаженный в винде с помощью QtCreator/MinGW, переносится в Linux, все происходит предсказуемо и работает, кроме одного момента (в MinGW проблемы нет, все работает):

приложение расширяется с помощью динамических библиотек, но не стандартных Qt-плагинов, а загрузкой библиотек, создаваемых специальным образом - так получилось исторически, поскольку библиотеки пишутся на С, а не С++, и Qt они не используют, это оптимизированные вычислительные модули

код загрузки библиотеки весь не нужно приводить, только кусок, который собственно загружает и проверяет:

Код:
QLibrary lib( libFileName() );	// при этом вызове libFileName() возвращает в Linux имя файла в виде: "./libsomename.so", в WinGW просто "somename.dll"
if( ! lib.isLoaded() )
   if( ! lib.load() ) // вроде бы конструктор должен грузить, но не грузит, это для пущей уверенности
         return; // здесь в Linux вылетает

библиотека собирается сразу перед сборкой основного приложения, в смежном проекте, теми же средствами, начало ее .pro выглядит так:

QT -= core
TARGET = somename
CONFIG += shared
TEMPLATE = lib

что не так? почему не грузится библиотека в Linux?
« Последнее редактирование: Ноябрь 23, 2010, 17:32 от Гурман » Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #1 : Ноябрь 23, 2010, 17:35 »

Добавь после load:
Код
C++ (Qt)
qDebug() << lib.errorString();
 

и покажи что она выводит.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Ноябрь 23, 2010, 17:41 »

"Unknown error"

обалдеть как информативно...  Грустный
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Ноябрь 23, 2010, 17:47 »

а, не, это было после конструктора, после load вот это:

Цитировать
Cannot load library libsomename.so: (libsomename.so: невозможно открыть разделяемый объектный файл: Нет такого файла или каталога)

хотя такой файл находится именно в текущем каталоге, поскольку его имя получено из списка текущего каталога

там, на самом деле, вот так:

Код:
QDir dir( "", "", QDir::Name );
QFileInfoList dirList = dir.entryInfoList();

unsigned int i;
for( i = 0; i < dirList.length() && i < MAXDLLNUMBER; i++ )
 if( QLibrary::isLibrary( dirList[ i ].fileName() ) )
   {
     QLibrary lib( dirList[ i ].fileName() );
        if( ! lib.isLoaded() )
           if( ! lib.load() )
                return;
        .......

то есть, файл заведомо существует и виден в dirList в отладчике, правда как "./libsomename.so", что по идее не принципиально
« Последнее редактирование: Ноябрь 23, 2010, 18:03 от Гурман » Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #4 : Ноябрь 23, 2010, 18:22 »

а, не, это было после конструктора, после load вот это:

Цитировать
Cannot load library libsomename.so: (libsomename.so: невозможно открыть разделяемый объектный файл: Нет такого файла или каталога)

хотя такой файл находится именно в текущем каталоге, поскольку его имя получено из списка текущего каталога
А какой каталог является рабочим?
Ты исполняемый файл сам в терминале запускаешь или из среды его стартуешь?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Ноябрь 23, 2010, 18:29 »

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

как ни запускай - что из отладчика, что само приложение из терминала - все одинаково

тем более, в имени файла содержится ./ то есть, он должен именно из рабочего каталога браться

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

ощущение такое, что надо писать bug report...
« Последнее редактирование: Ноябрь 23, 2010, 18:39 от Гурман » Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #6 : Ноябрь 23, 2010, 18:39 »

QString QFileInfo::absoluteFilePath () const
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Ноябрь 23, 2010, 18:52 »

Код:
            if( ! lib.load() )
            {
                QFileInfo fi( dirList[ i ].fileName() );
                QString eee = fi.absoluteFilePath();
                continue;
            }

fi == "libsomename.co"
eee == "/home/Documents/APP-build-desktop/libsomename.so"

и приложение, и библиотека находятся в /home/Documents/APP-build-desktop

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

попробую открыть по абсолютному маршруту, но это не есть кошерно
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Ноябрь 23, 2010, 18:56 »

по абсолютному маршруту заработало

ИМХО - баг имеет место быть, файл .so не открывается в текущем каталоге в Linux-версии, в Windows-версии все работает
Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #9 : Ноябрь 23, 2010, 19:14 »

ИМХО - баг имеет место быть, файл .so не открывается в текущем каталоге в Linux-версии, в Windows-версии все работает
Нет никакого бага.
Почитай, что возвращает QString QFileInfo::fileName () const, там даже пример есть.
Никакого ./ перед файлом этот метод не возвращает, поэтому загрузчик ищет эти библиотеки по стандартным путям (в linux текущий каталог в эти пути не входит, в отличие от венды).
Что написал, то и получил.  Подмигивающий
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Ноябрь 23, 2010, 19:26 »

как это ./ нет перед именем, если я его в отладчике вижу??

в отладчике четко видно, что

dirList[ i ].fileName() == "./libsomename.so"
Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #11 : Ноябрь 23, 2010, 19:32 »

как это ./ нет перед именем, если я его в отладчике вижу??

в отладчике четко видно, что

dirList[ i ].fileName() == "./libsomename.so"

А если через qDebug вывести?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Ноябрь 23, 2010, 19:35 »

да просто если строке присвоить - в ней уже нет ./  В замешательстве

то есть, баг таки есть, но в другом месте
« Последнее редактирование: Ноябрь 23, 2010, 19:41 от Гурман » Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #13 : Ноябрь 23, 2010, 19:41 »

да просто если строке присвоить - в ней уже нет ./  В замешательстве

то есть, баг таки есть, но в другом месте, причем не факт, что в отладчике, похоже в классе QFileInfoList
Если все работает согласно документации, то в чем баг.  Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #14 : Ноябрь 23, 2010, 19:43 »

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

да и вообще это сбивает с толку
« Последнее редактирование: Ноябрь 23, 2010, 19:45 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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