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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка библиотеки при помощи QLibrary  (Прочитано 13341 раз)
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-шных стандартных папок, не подходят.
Или надо указывать полный путь к файлу.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Август 10, 2007, 00:00 »

Можно ещё попробывать прописать путь к своей либе в LD_LIBRARY_PATH или натравить тулзу ldconfig на папку с либой
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
-=QT=-
Гость
« Ответ #2 : Август 10, 2007, 09:11 »

А если смотреть в сторону кроссплатформенности то IMHO вообще принять за правило
работу с файлами осуществлять по полному пути.
Записан
WW
Гость
« Ответ #3 : Август 10, 2007, 09:18 »

Цитата: "-=QT=-"
А если смотреть в сторону кроссплатформенности то IMHO вообще принять за правило
работу с файлами осуществлять по полному пути.

Пральна!  :wink: /usr/lib/ он и в винде /usr/lib/!  :lol:
Записан
spigel
Гость
« Ответ #4 : Август 10, 2007, 10:24 »

для загрузки библиотеки используй абсолютный путь либо доверься воли Qt и операционной системы :-)

в примерах Qt часто используется в этих случаях QDir!
Записан
-=QT=-
Гость
« Ответ #5 : Август 10, 2007, 10:51 »

Цитата: "WW"
Цитата: "-=QT=-"
А если смотреть в сторону кроссплатформенности то IMHO вообще принять за правило
работу с файлами осуществлять по полному пути.

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


Ну почти так как было сказано  Веселый  но с поправкой:
Код:
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);
Записан
cresta
Гость
« Ответ #6 : Август 11, 2007, 00:30 »

Вобще-то под виндой я qt не использую, вполне достаточно winapi без всяких классовых заморочек. Так что мне всё равно, во что проецируется в винде /usr/lib Улыбающийся

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

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

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

Всё, нашел в чём дело. Грабли в хэлпе разложены густо (или часто?) Улыбающийся
А может и то, и другое Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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