Russian Qt Forum

Qt => Общие вопросы => Тема начата: RVZ от Сентябрь 28, 2010, 15:44



Название: Самописный Dll не находится :(
Отправлено: 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
Подскажите пожалуйста как заставить прогу найти библ


Название: Re: Самописный Dll не находится :(
Отправлено: Denjs от Сентябрь 28, 2010, 15:53
а с чего вы взяли что у вас _библиотека_ не находится?
у вас по моему не находится имя/функция в данной библиотеке - GetList().

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


Название: Re: Самописный Dll не находится :(
Отправлено: Amigo_sa от Сентябрь 28, 2010, 15:54
Я обычно использую абсолютные пути, определяемые как QApplication::ApplicationDirPath(), и путь к либе считаю относительно него. Потому что для разных конфигураций может быть разные директории рабочие директории. (WorkingDirectory в студии, кста, она могла у вас поменяться)


Название: Re: Самописный Dll не находится :(
Отправлено: Denjs от Сентябрь 28, 2010, 15:59
а мне ещё  интересно,  что у автора после первой строчки выдаст bool QLibrary::isLoaded () const ????



Название: Re: Самописный Dll не находится :(
Отправлено: RVZ от Сентябрь 28, 2010, 18:16
а с чего вы взяли что у вас _библиотека_ не находится?
у вас по моему не находится имя/функция в данной библиотеке - GetList().

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

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

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

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

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





Название: Re: Самописный Dll не находится :(
Отправлено: RVZ от Сентябрь 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
 ???
как то странно


Название: Re: Самописный Dll не находится :(
Отправлено: Alex_cs_gsp от Сентябрь 29, 2010, 10:14
Длл ищется сначала в рабочей директории. Если вы, например, открываете файл какой-либо программой, например двойным кликом по нему, то рабочей директорией будет папка где этот файл расположен, конечно там длл никакой нет. Если под виндой, то на вынь-апи я всегда получал путь, где находится  .exe и плясал оттуда, загружая нужные длл.


Название: Re: Самописный Dll не находится :(
Отправлено: RVZ от Сентябрь 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).
Еще раз всем спасибо!! :D


Название: Re: Самописный Dll не находится :(
Отправлено: Amigo_sa от Сентябрь 29, 2010, 19:03
Цитировать
(WorkingDirectory в студии, кста, она могла у вас поменяться)
WorkingDirectory <- Я нашел только в классе QProcess но там сказано что этот класс для запуска и управления внешними процессами
я немного не о той рабочей директории. Как верно написано в описании QProcess, она устанавливается внешней IDE, например в Visual Studio это настраивается в меню Properties\Configuration properties\Debuggin. Именно начиная с это директории приложение из под дебага будет искать библиотеки.