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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: [РЕШЕНО, но так себе] Грузит не ту DLL  (Прочитано 16735 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #15 : Декабрь 13, 2016, 11:17 »

Цитировать
На самом деле это delphi проект, который грузить dll написанную на Qt, и вот при загрузке этой длл возникает эта ошибка.

Эмм... а разве так можно? Откуда дельфи знает про Qt?  Шокированный
Или имеется ввиду, что dll-ка написана в QtCreator без использования Qt-шных классов?

Конечно можно, дельфи вообще без разницы на чем написана длл. Он просто грузит длл и вызывает из нее мою функцию в которой уже запускается кутишный цикл событий и все такое. Вот в это время (скорее всего при создании QApplication) начинается подгрузка кутишный библиотек, которые лежат рядом. Все грузятся нормально, кроме libstdc++-6.dll.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #16 : Декабрь 13, 2016, 11:56 »

Цитировать
На самом деле это delphi проект, который грузить dll написанную на Qt, и вот при загрузке этой длл возникает эта ошибка.

Эмм... а разве так можно? Откуда дельфи знает про Qt?  Шокированный
Или имеется ввиду, что dll-ка написана в QtCreator без использования Qt-шных классов?

Конечно можно, дельфи вообще без разницы на чем написана длл. Он просто грузит длл и вызывает из нее мою функцию в которой уже запускается кутишный цикл событий и все такое. Вот в это время (скорее всего при создании QApplication) начинается подгрузка кутишный библиотек, которые лежат рядом. Все грузятся нормально, кроме libstdc++-6.dll.

А как же бинарная совместимость? Если компиляторы dll и exe разные используются?
Записан

Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #17 : Декабрь 13, 2016, 12:01 »

Цитировать
На самом деле это delphi проект, который грузить dll написанную на Qt, и вот при загрузке этой длл возникает эта ошибка.

Эмм... а разве так можно? Откуда дельфи знает про Qt?  Шокированный
Или имеется ввиду, что dll-ка написана в QtCreator без использования Qt-шных классов?

Конечно можно, дельфи вообще без разницы на чем написана длл. Он просто грузит длл и вызывает из нее мою функцию в которой уже запускается кутишный цикл событий и все такое. Вот в это время (скорее всего при создании QApplication) начинается подгрузка кутишный библиотек, которые лежат рядом. Все грузятся нормально, кроме libstdc++-6.dll.

А как же бинарная совместимость? Если компиляторы dll и exe разные используются?

Это важно только на стадии линковки. При динамической загрузке не важно какой там компилятор - машинный код же. Хоть на прологе пиши длл
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #18 : Декабрь 13, 2016, 13:07 »

А как же бинарная совместимость? Если компиляторы dll и exe разные используются?

ABI С стандартизован, как и code conventions. Можно из дллки отрезолвить сишную функцию (с правильным code convention) и вызвать её.
Неважно из какого языка.
Плюсовую функцию нельзя, потому что mangnling имен не стандартизован и неизвестно, как она реально называется.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Декабрь 13, 2016, 16:59 »

Вот в это время (скорее всего при создании QApplication) начинается подгрузка кутишный библиотек, которые лежат рядом. Все грузятся нормально, кроме libstdc++-6.dll.
Обычно это не так, либы грузятся до загрузки модуля который их требует. Если хоть с одной не вышло - до main дело не дойдет. В консоли отладчика (по крайней мере на MSVC) показываются загружаемые модули. Я бы начал с выяснения кому нужна эта libstdc++-6.dll. Сделал бы тестовое приложение (абы запустилось) и посмотрел бы перед какой либой грузится libstdc.
Записан
Bepec
Гость
« Ответ #20 : Декабрь 13, 2016, 21:29 »

Неее, половина Qt теперь на плагинах построена.
Которые занимаются непосредственным резолвингом функций уже после загрузки приложения. Там у них тупо вбито "LoadLibrary" и "GetProcAddress".
Поэтому даже загрузка приложения != подгрузка всех библиотек. Сам с этим сталкивался, когда с бдшками работал и сетью.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Декабрь 14, 2016, 12:14 »

Неее, половина Qt теперь на плагинах построена.
Которые занимаются непосредственным резолвингом функций уже после загрузки приложения. Там у них тупо вбито "LoadLibrary" и "GetProcAddress".
Для данной либы (libstdc) слишком много пришлось бы резолвить

Проблема в том что неубогое Вындоуз наверное не позволит загрузить др либу хоть откуда если либа с таким именем уже в памяти процесса. Придется как-то переименовывать (libstdZ что ли) и править ссылки во всех использующих либах. Уродство конечно. Или линковать всю свою либу статычно чтобы избавиться от зависимости libstdc

Впрочем послушаем тех кто утверждал что Вындоуз впереди планеты всей  Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #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 Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #23 : Декабрь 14, 2016, 13:31 »

>>Вындоуз наверное не позволит загрузить др либу хоть откуда если либа с таким именем уже в памяти процесса.
а откуда она появилась в памяти процесса?
Это типа такой зоопарк у процесса что ему одновременно нужны DLL-ки с одинаковым именем, но совершенно не совместимые между собой?
Записан

Юра.
Bepec
Гость
« Ответ #24 : Декабрь 14, 2016, 13:57 »

А Linux позволяет загрузить в приложение 2 версии одной Dll? Рили?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Декабрь 14, 2016, 14:17 »

А Linux позволяет загрузить в приложение 2 версии одной Dll? Рили?
Про линукс ничего не скажу, а OSX точно позволяет
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #26 : Декабрь 14, 2016, 15:38 »

Хм, а можно как то узнать какие переменные окружения задает приложение при запуске? И как узнать какая  именно длл подгружается, по какому пути?
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #27 : Декабрь 14, 2016, 16:12 »

Нашел откуда грузилась библиотека. Из некой FileZilla. Почему оттуда - непонятно, видимо родительское приложение как то неявно туда указывает или его переменные окружения не определены, а для FileZilla установлены глобально

Короче говоря основное приложение загружает кучу всяких модулей. Часть из них используют одну версию libstdc++-6.dll, часть - другую. Что делать в этой ситуации не понятно. Это какая то каша из длл которые ссылаются на другие длл которые ссылаются на общие длл но разных версий %)
« Последнее редактирование: Декабрь 14, 2016, 16:40 от Torvald » Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #28 : Декабрь 14, 2016, 17:03 »

Короче я просто переименовал libstdc++-6.dll в libstdc++-X.dll и заменил все ее упоминания во всех своих зависимых длл. Очень грязный хак, но как быстрое временное решение пока сойдет.

Всем большое спасибо за помощь. Вот уж точно dll hell :c
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Декабрь 15, 2016, 12:43 »

Короче я просто переименовал libstdc++-6.dll в libstdc++-X.dll и заменил все ее упоминания во всех своих зависимых длл. Очень грязный хак, но как быстрое временное решение пока сойдет.
Очень может быть что на данном ОС лучшего решения и объективно нет. Так что не переживайте и
Цитировать
Нет ничего более постоянного чем временное
Улыбающийся
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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