Развертывание Qt DLL в Windows - PullRequest
5 голосов
/ 15 мая 2009

У меня есть плагин для приложения от другой компании. Мой плагин использует Qt, поэтому ему нужны библиотеки Qt. Моя проблема в том, что все версии 4.x Qt Dlls называются одинаковыми, например, : QtCore4.dll. Вполне возможно, что какой-то другой плагин или другое приложение, которое вставило себя в переменную окружения PATH, поместило dll Qt в папку приложений. В этом случае плагин не запустится, так как ожидает другую версию DLL.

  • Q1. Какова рекомендуемая общая практика для развертывания DLL?
  • Q2. Что, если хост-приложение использует другую версию Qt. Позволят ли окна хост-приложению и плагину использовать разные версии ()?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 20 ноября 2009

Просто чтобы помочь другим с этой проблемой: DLL QT гарантированно будут одинаковыми (или, по крайней мере, двоичными) для всех версий 4.X. (одинаково для всех версий 3.X и т. д.), поэтому проблем не будет. Это также причина, по которой в именах Qt dll нет второго числа.

3 голосов
/ 30 сентября 2009

A1: Рекомендация: поместите DLL в каталог исполняемого файла. Сначала он будет искать там загрузку DLL. Это обычная практика.

A2: Если каким-то образом приложение использует другую версию Qt, а модуль, который вы описываете, требует более поздней или конкретной версии, это может вызвать проблему (не работать, вылетать и т. Д.).

При статическом линковании вы также должны учитывать лицензионные ограничения Qt. LGPL счастлив, если библиотека динамически загружается во время выполнения и может быть отделена от приложения. Это применимо только в том случае, если вы не публикуете свой источник и т. Д.

Кроме того, ваш установщик должен настроить доступ к этим файлам, чтобы они были защищены от перезаписи другим мошенническим приложением.

1 голос
/ 29 сентября 2009

В версиях Windows начиная с XP (то есть XP, 2003, Vista, 2008 и Win7) можно использовать параллельные сборки или перенаправление DLL . В любом случае, по сути, вы включаете небольшой текстовый файл, который сообщает операционной системе, что вам нужно использовать конкретную версию DLL, включенную в тот же каталог, что и исполняемый файл.

Это менее известные функции, но они действительно могут спасти вашу задницу от "DLL Hell".

0 голосов
/ 03 декабря 2015

В целях безопасности вы должны быть уверены, что ваше приложение использует версии dll, которые вы хотите использовать. Windows гарантированно заглянет в папку приложения в первую очередь. Таким образом, вы должны поместить все свои бинарные зависимости.

Если ваше приложение не запускается при двойном щелчке по нему в проводнике, Windows сообщит вам, что для этого нужно. Скопируйте эту DLL в папку приложения. Перейдите к следующему шагу, если ваше приложение работает.

Теперь вы должны временно удалить (или переименовать) DLL-библиотеку одну за другой, которую вы поместили в папку приложения, и каждый раз, когда вам нужно дважды щелкнуть ваше приложение. Если винда не жалуется, она обнаружила dll где-то еще. Извлеките эту dll из среды PATH (возможно, временно). Rapid Environment Editor - бесплатная утилита с редактированием переменных среды, которые вступают в силу немедленно.

Только если вы уверены, что ваше приложение использует dll в dir приложения и не извлекает никакие dll откуда-либо еще, вы можете снова начать редактирование переменной PATH, чтобы восстановить старую ситуацию.

0 голосов
/ 15 мая 2009

Как сказал Тим, вы должны развернуть DLL в том же каталоге, что и создаваемое вами приложение / плагин. Я полагаю, что переменная PATH - это не первое место, где ваша программа будет искать dll QT4, поэтому, если вы развернете ее в той же папке, ваше приложение выберет одну из них с вашим приложением и проигнорирует все, что находится в переменной PATH.

Q1: В прошлом казалось, что все бросали свои DLL в папку system32, потому что они знали, что это было в PATH, и знали, что программа сможет найти его. С точки зрения пользователя я нахожу, что очень трудно убрать, когда я хочу что-то удалить. А теперь, учитывая небольшую стоимость хранилища, я бы сказал, что сохраняйте свои библиотеки DLL в своем приложении, особенно если они такие, где может быть несколько версий. Хотя я не эксперт, именно так я работаю с jar-файлами для приложений Java.

Q2: Я бы так подумал. Это будет зависеть от структуры каталогов приложения и плагина. Вы можете указать своему плагину, какую версию использовать, и я готов поспорить, что приложение уже имеет свою версию в специальном месте.

0 голосов
/ 15 мая 2009

Нет ли способа выбрать статическую связь с Qt?

Я бы развернул DLL в той же директории, что и мой app / plugin.

Это не отвечает вашим другим проблемам.

...