Russian Qt Forum
Ноябрь 22, 2024, 23:29
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Установка, сборка, отладка, тестирование
>
[РЕШЕНО, но так себе] Грузит не ту DLL
Страниц:
1
[
2
]
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: [РЕШЕНО, но так себе] Грузит не ту DLL (Прочитано 16739 раз)
Torvald
Самовар
Offline
Сообщений: 119
Re: Грузит не ту DLL
«
Ответ #15 :
Декабрь 13, 2016, 11:17 »
Цитата: kuzulis от Декабрь 12, 2016, 19:32
Цитировать
На самом деле это delphi проект, который грузить dll написанную на Qt, и вот при загрузке этой длл возникает эта ошибка.
Эмм... а разве так можно? Откуда дельфи знает про Qt?
Или имеется ввиду, что dll-ка написана в QtCreator без использования Qt-шных классов?
Конечно можно, дельфи вообще без разницы на чем написана длл. Он просто грузит длл и вызывает из нее мою функцию в которой уже запускается кутишный цикл событий и все такое. Вот в это время (скорее всего при создании QApplication) начинается подгрузка кутишный библиотек, которые лежат рядом. Все грузятся нормально, кроме libstdc++-6.dll.
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: Грузит не ту DLL
«
Ответ #16 :
Декабрь 13, 2016, 11:56 »
Цитата: Torvald от Декабрь 13, 2016, 11:17
Цитата: kuzulis от Декабрь 12, 2016, 19:32
Цитировать
На самом деле это delphi проект, который грузить dll написанную на Qt, и вот при загрузке этой длл возникает эта ошибка.
Эмм... а разве так можно? Откуда дельфи знает про Qt?
Или имеется ввиду, что dll-ка написана в QtCreator без использования Qt-шных классов?
Конечно можно, дельфи вообще без разницы на чем написана длл. Он просто грузит длл и вызывает из нее мою функцию в которой уже запускается кутишный цикл событий и все такое. Вот в это время (скорее всего при создании QApplication) начинается подгрузка кутишный библиотек, которые лежат рядом. Все грузятся нормально, кроме libstdc++-6.dll.
А как же бинарная совместимость? Если компиляторы dll и exe разные используются?
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Torvald
Самовар
Offline
Сообщений: 119
Re: Грузит не ту DLL
«
Ответ #17 :
Декабрь 13, 2016, 12:01 »
Цитата: gil9red от Декабрь 13, 2016, 11:56
Цитата: Torvald от Декабрь 13, 2016, 11:17
Цитата: kuzulis от Декабрь 12, 2016, 19:32
Цитировать
На самом деле это delphi проект, который грузить dll написанную на Qt, и вот при загрузке этой длл возникает эта ошибка.
Эмм... а разве так можно? Откуда дельфи знает про Qt?
Или имеется ввиду, что dll-ка написана в QtCreator без использования Qt-шных классов?
Конечно можно, дельфи вообще без разницы на чем написана длл. Он просто грузит длл и вызывает из нее мою функцию в которой уже запускается кутишный цикл событий и все такое. Вот в это время (скорее всего при создании QApplication) начинается подгрузка кутишный библиотек, которые лежат рядом. Все грузятся нормально, кроме libstdc++-6.dll.
А как же бинарная совместимость? Если компиляторы dll и exe разные используются?
Это важно только на стадии линковки. При динамической загрузке не важно какой там компилятор - машинный код же. Хоть на прологе пиши длл
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Грузит не ту DLL
«
Ответ #18 :
Декабрь 13, 2016, 13:07 »
Цитата: gil9red от Декабрь 13, 2016, 11:56
А как же бинарная совместимость? Если компиляторы dll и exe разные используются?
ABI С стандартизован, как и code conventions. Можно из дллки отрезолвить
сишную
функцию (с правильным code convention) и вызвать её.
Неважно из какого языка.
Плюсовую функцию нельзя, потому что mangnling имен не стандартизован и неизвестно, как она реально называется.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Грузит не ту DLL
«
Ответ #19 :
Декабрь 13, 2016, 16:59 »
Цитата: Torvald от Декабрь 13, 2016, 11:17
Вот в это время (скорее всего при создании QApplication) начинается подгрузка кутишный библиотек, которые лежат рядом. Все грузятся нормально, кроме libstdc++-6.dll.
Обычно это не так, либы грузятся до загрузки модуля который их требует. Если хоть с одной не вышло - до main дело не дойдет. В консоли отладчика (по крайней мере на MSVC) показываются загружаемые модули. Я бы начал с выяснения кому нужна эта libstdc++-6.dll. Сделал бы тестовое приложение (абы запустилось) и посмотрел бы перед какой либой грузится libstdc.
Записан
Bepec
Гость
Re: Грузит не ту DLL
«
Ответ #20 :
Декабрь 13, 2016, 21:29 »
Неее, половина Qt теперь на плагинах построена.
Которые занимаются непосредственным резолвингом функций уже после загрузки приложения. Там у них тупо вбито "LoadLibrary" и "GetProcAddress".
Поэтому даже загрузка приложения != подгрузка всех библиотек. Сам с этим сталкивался, когда с бдшками работал и сетью.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Грузит не ту DLL
«
Ответ #21 :
Декабрь 14, 2016, 12:14 »
Цитата: Bepec от Декабрь 13, 2016, 21:29
Неее, половина Qt теперь на плагинах построена.
Которые занимаются непосредственным резолвингом функций уже после загрузки приложения. Там у них тупо вбито "LoadLibrary" и "GetProcAddress".
Для данной либы (libstdc) слишком много пришлось бы резолвить
Проблема в том что неубогое Вындоуз наверное не позволит загрузить др либу хоть откуда если либа с таким именем уже в памяти процесса. Придется как-то переименовывать (libstdZ что ли) и править ссылки во всех использующих либах. Уродство конечно. Или линковать всю свою либу статычно чтобы избавиться от зависимости libstdc
Впрочем послушаем тех кто утверждал что Вындоуз впереди планеты всей
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Грузит не ту DLL
«
Ответ #22 :
Декабрь 14, 2016, 12:22 »
Мда, в Винде действительно геморрой с dll. В Линухе все намного удобнее - LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./prog и все работает.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Грузит не ту DLL
«
Ответ #23 :
Декабрь 14, 2016, 13:31 »
>>Вындоуз наверное не позволит загрузить др либу хоть откуда если либа с таким именем уже в памяти процесса.
а откуда она появилась в памяти процесса?
Это типа такой зоопарк у процесса что ему одновременно нужны DLL-ки с одинаковым именем, но совершенно не совместимые между собой?
Записан
Юра.
Bepec
Гость
Re: Грузит не ту DLL
«
Ответ #24 :
Декабрь 14, 2016, 13:57 »
А Linux позволяет загрузить в приложение 2 версии одной Dll? Рили?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Грузит не ту DLL
«
Ответ #25 :
Декабрь 14, 2016, 14:17 »
Цитата: Bepec от Декабрь 14, 2016, 13:57
А Linux позволяет загрузить в приложение 2 версии одной Dll? Рили?
Про линукс ничего не скажу, а OSX точно позволяет
Записан
Torvald
Самовар
Offline
Сообщений: 119
Re: Грузит не ту DLL
«
Ответ #26 :
Декабрь 14, 2016, 15:38 »
Хм, а можно как то узнать какие переменные окружения задает приложение при запуске? И как узнать какая именно длл подгружается, по какому пути?
Записан
Torvald
Самовар
Offline
Сообщений: 119
Re: Грузит не ту DLL
«
Ответ #27 :
Декабрь 14, 2016, 16:12 »
Нашел откуда грузилась библиотека. Из некой FileZilla. Почему оттуда - непонятно, видимо родительское приложение как то неявно туда указывает или его переменные окружения не определены, а для FileZilla установлены глобально
Короче говоря основное приложение загружает кучу всяких модулей. Часть из них используют одну версию libstdc++-6.dll, часть - другую. Что делать в этой ситуации не понятно. Это какая то каша из длл которые ссылаются на другие длл которые ссылаются на общие длл но разных версий %)
«
Последнее редактирование: Декабрь 14, 2016, 16:40 от Torvald
»
Записан
Torvald
Самовар
Offline
Сообщений: 119
Re: Грузит не ту DLL
«
Ответ #28 :
Декабрь 14, 2016, 17:03 »
Короче я просто переименовал libstdc++-6.dll в libstdc++-X.dll и заменил все ее упоминания во всех своих зависимых длл. Очень грязный хак, но как быстрое временное решение пока сойдет.
Всем большое спасибо за помощь. Вот уж точно dll hell :c
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Грузит не ту DLL
«
Ответ #29 :
Декабрь 15, 2016, 12:43 »
Цитата: Torvald от Декабрь 14, 2016, 17:03
Короче я просто переименовал libstdc++-6.dll в libstdc++-X.dll и заменил все ее упоминания во всех своих зависимых длл. Очень грязный хак, но как быстрое временное решение пока сойдет.
Очень может быть что на данном ОС лучшего решения и объективно нет. Так что не переживайте и
Цитировать
Нет ничего более постоянного чем временное
Записан
Страниц:
1
[
2
]
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...