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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отключить run-time подключение необязательных библиотек?  (Прочитано 3407 раз)
stopa3.10.1996
Гость
« : Октябрь 23, 2017, 17:09 »

Всем привет!

Программа, написанная с использованием Qt 4.8.6, валится, когда системный линкер находит где-то библиотеку QtXml4.dll от другой версии Qt и пытается её загрузить. Если положить QtXml от этой же сборки Qt в рабочую директорию нашей программы, то всё работает нормально(ибо рабочая директория на Win имеет больший приоритет, чем пути из PATH). Если сделать так, чтобы линкер не находил вообще никакой QtXml4.dll (и не подбрасывать ничего в рабочую директорию), то всё тоже работает. Явно QtXml нигде не линкуется к нашей программе. DependencyWalker говорит, что ни один бинарник из графа статических зависимостей от этой библиотеки тоже не зависит. Создаётся ощущение, что Qt реализует какой-то свой внутренний механизм динамической загрузки опциональных библиотек. Единственный известный мне способ реализовать такую систему - явно использовать что-то типа LoadLibrary в формате “если линкер находит где-то разделяемую библиотеку с нужным именем, то загрузить её, иначе - забить и работать дальше”, но поиск по коду/документации/интернету ничего на эту тему ничего не дал.

Буду очень признателен, если кто-нибудь подскажет, что я делаю не так. Заранее спасибо!
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 574


Просмотр профиля
« Ответ #1 : Октябрь 23, 2017, 17:38 »

Скорее всего один из динамически подгружаемых плагинов (форматы графики, драйвер БД и т.п.) задействует xml.
В случае отсутствия dll соответствующий плагин просто не подгружается и все работает.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Октябрь 23, 2017, 18:20 »

Если предыдущее верно, то попробуй устанавливать переменную окружения QT_DEBUG_PLUGINS=1 чтобы  видеть что он грузит
Записан
stopa3.10.1996
Гость
« Ответ #3 : Октябрь 30, 2017, 16:25 »

Я решил проблему.

Действительно, один из плагинов (QtSvg) подключал библиотеку QtXml4. Плагин нужен, поэтому добавил QtXml4 в каталог с программой.
Чтобы больше не возникало подобных проблем, рядом с исполняемым файлом положил файл qt.conf (http://doc.qt.io/qt-4.8/qt-conf.html) и сконфигурировал его так, чтобы Qt не подключал библиотеки из системных путей (и откуда-либо ещё, кроме как из папки с программой).

Спасибо за подсказки.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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