Russian Qt Forum

Qt => Общие вопросы => Тема начата: cresta от Август 09, 2007, 23:38



Название: Загрузка библиотеки при помощи QLibrary
Отправлено: cresta от Август 09, 2007, 23:38
Посмотрел в поиске, в хелпе, и решил попробовать.

Создал либу с одной единственной ф-цией:
   
Код:
#include    <qapplication.h>

extern "C" void PrintHex(int val){
    qDebug ("%08X", val);
}


откомпилил в libofn.so.1.0.0 c параметрами в ofn.pro
Код:
TEMPLATE = lib
CONFIG -= moc
INCLUDEPATH += .

CONFIG += dll
# Input
SOURCES += main.cpp


Полученую либу положил в папку с программой, из которой предполагается загружать либу, и в папку /usr/X11R6/lib/ (как одну из папок, в которой ищутся либы).

Теперь пытаюсь загрузить либу:
Код:

QLibrary lib( "ofn" );
qDebug(lib.library()); //выводится имя 'libofn.so'.
if ( lib.load () ){
    qDebug("library loaded");
    typedef void (*myProc)( int );
    myProc PrintHex = (myProc) lib.resolve( "PrintHex" );
    if ( PrintHex )
        PrintHex( 115 );
    else
        qDebug("PrintHex not found");
}
else{
    qDebug("library loading fail");
}


Но либа не грузится ("library loading fail"). Почему?

добавлено спустя 59 минут:

 Нашёл: если указано только имя либы, то грузится только из /usr/lib. Другие папки, типа qt-шных стандартных папок, не подходят.
Или надо указывать полный путь к файлу.


Название: Загрузка библиотеки при помощи QLibrary
Отправлено: pastor от Август 10, 2007, 00:00
Можно ещё попробывать прописать путь к своей либе в LD_LIBRARY_PATH или натравить тулзу ldconfig на папку с либой


Название: Загрузка библиотеки при помощи QLibrary
Отправлено: -=QT=- от Август 10, 2007, 09:11
А если смотреть в сторону кроссплатформенности то IMHO вообще принять за правило
работу с файлами осуществлять по полному пути.


Название: Загрузка библиотеки при помощи QLibrary
Отправлено: WW от Август 10, 2007, 09:18
Цитата: "-=QT=-"
А если смотреть в сторону кроссплатформенности то IMHO вообще принять за правило
работу с файлами осуществлять по полному пути.

Пральна!  :wink: /usr/lib/ он и в винде /usr/lib/!  :lol:


Название: Загрузка библиотеки при помощи QLibrary
Отправлено: spigel от Август 10, 2007, 10:24
для загрузки библиотеки используй абсолютный путь либо доверься воли Qt и операционной системы :-)

в примерах Qt часто используется в этих случаях QDir!


Название: Загрузка библиотеки при помощи QLibrary
Отправлено: -=QT=- от Август 10, 2007, 10:51
Цитата: "WW"
Цитата: "-=QT=-"
А если смотреть в сторону кроссплатформенности то IMHO вообще принять за правило
работу с файлами осуществлять по полному пути.

Пральна!  :wink: /usr/lib/ он и в винде /usr/lib/!  :lol:


Ну почти так как было сказано  :D  но с поправкой:
Код:
QmySettings::QmySettings()
#ifdef Q_OS_WIN32
        :
        QSettings (QDir::homePath()+"/Application Data/"+_MY_APPLICATION_NAME+".ini", QSettings::IniFormat)
#else
        :
        QSettings ( _MY_ORGANIZATION_NAME, _MY_APPLICATION_NAME )
#endif


и еще так :
Код:
assistant->setArguments(QStringList() << "-profile" << QApplication::applicationDirPath() + QDir::separator() + "docs" + QDir::separator() + QString("manual.adp"));
    assistant->showPage(path);


Название: Загрузка библиотеки при помощи QLibrary
Отправлено: cresta от Август 11, 2007, 00:30
Вобще-то под виндой я qt не использую, вполне достаточно winapi без всяких классовых заморочек. Так что мне всё равно, во что проецируется в винде /usr/lib :)

А вот ещё вопрос по теме библиотек: есть в линухе какие-нибудь тулзы, позволяющие посмотреть импорт и экспорт либы или исполняемого файла (аналог PEExplorer)?

добавлено спустя 2 минуты:

  Еще вопрос по либам:
сделал динамически подгружаемую либу.
Одна функция на экспорт. Загружается либа из тестовой проги нормально (через интерфейс QLibrary). Функция вызывается нормально.
Теперь создаю в либе класс. Добавляю myclass.h и myclass.cpp. Класс из себя представляет простой диалог.
Один конструктор и более ничего. Компилирую либу как исполняемый файл (для проверки) - все нормально, диалог присутствует.
Компилирую как либу - и либа с классом внутри отказывается загружаться тестовым приложением. В чем проблема? Диалог не создаю, класс просто есть внутри, но его конструктор не вызываю.
Или наличие класса в либе - это повод не загружаться?


Название: Загрузка библиотеки при помощи QLibrary
Отправлено: cresta от Август 12, 2007, 09:18
Всё, нашел в чём дело. Грабли в хэлпе разложены густо (или часто?) :)
А может и то, и другое :)