Russian Qt Forum

Программирование => Общий => Тема начата: Гурман от Ноябрь 23, 2010, 17:22



Название: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 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?


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: BRE от Ноябрь 23, 2010, 17:35
Добавь после load:
Код
C++ (Qt)
qDebug() << lib.errorString();
 

и покажи что она выводит.


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 23, 2010, 17:41
"Unknown error"

обалдеть как информативно...  :(


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 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", что по идее не принципиально


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: BRE от Ноябрь 23, 2010, 18:22
а, не, это было после конструктора, после load вот это:

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

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


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 23, 2010, 18:29
я же код написал - открывается именно рабочий каталог, считывается его содержимое, ищутся в нем файлы с именами библиотек, и загружаются

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

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

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

ощущение такое, что надо писать bug report...


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: BRE от Ноябрь 23, 2010, 18:39
QString QFileInfo::absoluteFilePath () const


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 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

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

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


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 23, 2010, 18:56
по абсолютному маршруту заработало

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


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: BRE от Ноябрь 23, 2010, 19:14
ИМХО - баг имеет место быть, файл .so не открывается в текущем каталоге в Linux-версии, в Windows-версии все работает
Нет никакого бага.
Почитай, что возвращает QString QFileInfo::fileName () const, там даже пример есть.
Никакого ./ перед файлом этот метод не возвращает, поэтому загрузчик ищет эти библиотеки по стандартным путям (в linux текущий каталог в эти пути не входит, в отличие от венды).
Что написал, то и получил.  ;)


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 23, 2010, 19:26
как это ./ нет перед именем, если я его в отладчике вижу??

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

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


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: BRE от Ноябрь 23, 2010, 19:32
как это ./ нет перед именем, если я его в отладчике вижу??

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

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

А если через qDebug вывести?


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 23, 2010, 19:35
да просто если строке присвоить - в ней уже нет ./  :-\

то есть, баг таки есть, но в другом месте


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: BRE от Ноябрь 23, 2010, 19:41
да просто если строке присвоить - в ней уже нет ./  :-\

то есть, баг таки есть, но в другом месте, причем не факт, что в отладчике, похоже в классе QFileInfoList
Если все работает согласно документации, то в чем баг.  :)


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: Гурман от Ноябрь 23, 2010, 19:43
в отладчике я вижу не то имя файла, которое получаю при присвоении из класса QFileInfoList - при каких-нибудь операциях с этим классом это может вылезти, мало ли... внутри класса файлы из текущего каталога, а вне класса уже без префикса ./

да и вообще это сбивает с толку


Название: Re: не грузится библиотека в Linux (MinGW работает)
Отправлено: BRE от Ноябрь 23, 2010, 19:48
в отладчике я вижу не то имя файла, которое получаю при присвоении из класса QFileInfoList - при каких-нибудь операциях с этим классом это может вылезти, мало ли... внутри класса файлы из текущего каталога, а вне класса уже без префикса ./

да и вообще это сбивает с толку
Программировать нужно по документации, а не по отладчику.
Скорее всего это debug-assistant так разворачивает имена для QFileInfoList, а в документации явно написано как будет на самом деле.  :)