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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Самописный Dll не находится :(  (Прочитано 5825 раз)
RVZ
Гость
« : Сентябрь 28, 2010, 15:44 »

Всем Здравствуйте!
В общем тихий ужос!
Пытаюсь использовать самописную dllку

Dll кА лежит в корне в папек lib то есть каталог проекта выглядит так
/
/lib
/debug
/include
Программка собирается в каталог debug
Файл файл библиотеки libsql1.dll в ней несколько функций для работы с БАзой

Код:
QLibrary libsql("../lib/libsql1");
typedef QStringList (*Tx)();
Tx tx = (Tx) (libsql.resolve("GetList"));
qDebug()<<libsql.errorString()<<libsql.fileName()<<" - dll"<<tx;
if(tx){ui->List->addItems(tx());}
В общем dllка работала хорошо первое время потом перестала находится

Код:
qDebug()<<libsql.errorString()<<libsql.fileName()<<" - dll"<<tx;
выводит такую штуку
"Cannot load library ../lib/libsql1: Не найдена указанная процедура." "../lib/libsql1" - dll false
Подскажите пожалуйста как заставить прогу найти библ
Записан
Denjs
Гость
« Ответ #1 : Сентябрь 28, 2010, 15:53 »

а с чего вы взяли что у вас _библиотека_ не находится?
у вас по моему не находится имя/функция в данной библиотеке - GetList().

смотрите что вы там в вашей библиотеке творите? не?
Записан
Amigo_sa
Гость
« Ответ #2 : Сентябрь 28, 2010, 15:54 »

Я обычно использую абсолютные пути, определяемые как QApplication::ApplicationDirPath(), и путь к либе считаю относительно него. Потому что для разных конфигураций может быть разные директории рабочие директории. (WorkingDirectory в студии, кста, она могла у вас поменяться)
Записан
Denjs
Гость
« Ответ #3 : Сентябрь 28, 2010, 15:59 »

а мне ещё  интересно,  что у автора после первой строчки выдаст bool QLibrary::isLoaded () const Непонимающий?

Записан
RVZ
Гость
« Ответ #4 : Сентябрь 28, 2010, 18:16 »

а с чего вы взяли что у вас _библиотека_ не находится?
у вас по моему не находится имя/функция в данной библиотеке - GetList().

смотрите что вы там в вашей библиотеке творите? не?

Я так подумал основываясь на фразе Cannot load library ../lib/libsql1: и решил что как следствие ->Не найдена указанная процедура
bool QLibrary::isLoaded () const <- это хорошая идея завтра на работе проверю

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

WorkingDirectory <- Я пока с таким не знаком сейчас возьмусь за изучение класса QProcess

Спасибо всем за ответы! теперь появилось направление для раскопок  Веселый



Записан
RVZ
Гость
« Ответ #5 : Сентябрь 29, 2010, 10:09 »

что то ни че не получается. Непонимающий
Цитировать
(WorkingDirectory в студии, кста, она могла у вас поменяться)
WorkingDirectory <- Я нашел только в классе QProcess но там сказано что этот класс для запуска и управления внешними процессами
Цитировать
The QProcess class is used to start external programs and to communicate with them
Но все равно добавил такой код на всякий случай в main.cpp
Код:
    QProcess proc;
    qDebug()<<"WD "<<proc.workingDirectory();
    proc.setWorkingDirectory("D:/Project/RecCom/debug");
    qDebug()<<"WD "<<proc.workingDirectory();
    QApplication a(argc, argv);

    qDebug()<<"AppPaph "<<a.applicationDirPath();
    a.addLibraryPath("D:/Project/RecCom/lib");
    qDebug()<<"LibPaph "<<a.libraryPaths();

выход получился следующий.

WD  ""
WD  "D:/Project/RecCom/debug"
AppPaph  "D:/Project/RecCom/debug"
LibPaph  ("D:/Project/RecCom/lib", "C:/Qt/4.6.2/plugins", "D:/Project/RecCom/debug")

также вывел .isLoaded(); для либы
Код:
    QLibrary libsql("../lib/libsql1");
    qDebug()<<"Is load "<<libsql.isLoaded();

    QLibrary libsql2("libsql1");
    qDebug()<<"Is load "<<libsql2.isLoaded();

Вывод получился
Is load  false
Is load  false
 Непонимающий
как то странно
Записан
Alex_cs_gsp
Гость
« Ответ #6 : Сентябрь 29, 2010, 10:14 »

Длл ищется сначала в рабочей директории. Если вы, например, открываете файл какой-либо программой, например двойным кликом по нему, то рабочей директорией будет папка где этот файл расположен, конечно там длл никакой нет. Если под виндой, то на вынь-апи я всегда получал путь, где находится  .exe и плясал оттуда, загружая нужные длл.
« Последнее редактирование: Сентябрь 29, 2010, 10:17 от Alex_cs_gsp » Записан
RVZ
Гость
« Ответ #7 : Сентябрь 29, 2010, 13:35 »

Всем спасибо за внимание!
Проблему решил самым неправильным способом который можно только придумать
Переустановил QT и Creator
Причем после переустановки пришлось переопределить настройки сборки и настройки запуска в боковом меню проекты
А также обнаружилась среди нормальных директорий странная запись “lib” в переменной PATH (Среда выполнения) ее просто удалил
В общем после этих действий проект нормально собрался и унюхал библ причем isLoaded() выдал истину только после .resolve
Код:
    QLibrary libsql("../lib/libsql1");
    qDebug()<<"Is load 1 "<<libsql.isLoaded();
    typedef QStringList (*Tx)();
    qDebug()<<"Is load 2 "<<libsql.isLoaded();
    Tx tx = (Tx) (libsql.resolve("GetList"));
    qDebug()<<"Is load 3 "<<libsql.isLoaded();
    qDebug()<<libsql.errorString()<<libsql.fileName()<<" - dll"<<tx;

Is load 1  false
Is load 2  false
Is load 3  true
"Unknown error" "../lib/libsql1.dll"  - dll true

Конечно несколько расстраивает факт что все таки не удалось разобраться что же было не так на самом деле

Цитировать
Длл ищется сначала в рабочей директории.
вот это не есть хорошо
у кого нибудь есть пример как заставить приложение искать либы QT только в конкретных местах и не где кроме конкретных мест. Пробовал экспериментировать с libraryPaths() толков ни каких
Код:
a.removeLibraryPath(a.applicationDirPath());
даже после этого прога цепляет либы QT из директории где выполняется
это наверное уже другая тема(Буду теперь живодерить NCReport).
Еще раз всем спасибо!! Веселый
Записан
Amigo_sa
Гость
« Ответ #8 : Сентябрь 29, 2010, 19:03 »

Цитировать
(WorkingDirectory в студии, кста, она могла у вас поменяться)
WorkingDirectory <- Я нашел только в классе QProcess но там сказано что этот класс для запуска и управления внешними процессами
я немного не о той рабочей директории. Как верно написано в описании QProcess, она устанавливается внешней IDE, например в Visual Studio это настраивается в меню Properties\Configuration properties\Debuggin. Именно начиная с это директории приложение из под дебага будет искать библиотеки.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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