Russian Qt Forum

Qt => Общие вопросы => Тема начата: stopa3.10.1996 от Октябрь 23, 2017, 17:09



Название: Как отключить run-time подключение необязательных библиотек?
Отправлено: stopa3.10.1996 от Октябрь 23, 2017, 17:09
Всем привет!

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

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


Название: Re: Как отключить run-time подключение необязательных библиотек?
Отправлено: ssoft от Октябрь 23, 2017, 17:38
Скорее всего один из динамически подгружаемых плагинов (форматы графики, драйвер БД и т.п.) задействует xml.
В случае отсутствия dll соответствующий плагин просто не подгружается и все работает.


Название: Re: Как отключить run-time подключение необязательных библиотек?
Отправлено: Alex Custov от Октябрь 23, 2017, 18:20
Если предыдущее верно, то попробуй устанавливать переменную окружения QT_DEBUG_PLUGINS=1 чтобы  видеть что он грузит


Название: Re: Как отключить run-time подключение необязательных библиотек?
Отправлено: stopa3.10.1996 от Октябрь 30, 2017, 16:25
Я решил проблему.

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

Спасибо за подсказки.