Как организовать библиотеки DLL Qt с зависимостью на основе Qt

У меня есть приложение Qt, использующее Qt 4.8.5. Это приложение зависит от библиотеки DLL, которая была построена с использованием Qt 4.6.0. Давайте назовем это «MyDLL.dll».

Я не могу перестроить MyDLL.dll, чтобы обновить его до более свежей версии Qt. Поскольку и для моего приложения, и для MyDLL требуются QtCore и другие библиотеки DLL, а версии разные, как мне организовать свои файлы так, чтобы они не конфликтовали?

MyDLL требуется при запуске, поэтому я не могу использовать методологии отложенной загрузки.

редактировать: чтобы быть ясным, этот вопрос возник, потому что MyDll.dll был собран с использованием пользовательского Qt 4.6.0 из модифицированного источника, а мое приложение использует пользовательскую сборку 4.8.5. Изменения не обязательно были одинаковыми в обеих версиях, поэтому я не хотел предполагать, что я все еще могу использовать DLL-файлы 4.8.5. Оказалось, что это сработало в этом случае, но вопрос стоит.

1

Решение

У вас не должно быть проблем. Qt поддерживает бинарную совместимость с небольшими выпусками и выпусками исправлений (см. http://qt-project.org/wiki/Qt-Version-Compatibility) и приложение / DLL, созданное с использованием 4.6.x, будет нормально работать, если привязано к среде выполнения 4.8.x.

  • Ваш MyDLL.dll, созданный с 4.6.0, будет работать с 4.8.5 библиотеками времени выполнения.
  • Ваше приложение, созданное с 4.8.5, будет работать с 4.8.5 DLL-библиотеками времени выполнения.
  • Ваше приложение будет нормально работать с MyDLL.dll, если вы используете тот же интерфейс, который вы всегда использовали.

Если вы видите проблемы, это из-за чего-то другого, и вам нужно будет уточнить, какие именно у вас проблемы.

Если вы не видите проблем и просто задаете вопрос превентивно, то 1) просто действуйте как обычно, без особых соображений, и 2) вы должны были сначала попробовать!

2

Другие решения

Добро пожаловать в DLL Ад! 🙁

Это огромная проблема в Microsoft Windows, поскольку стандарт не встраивает информацию о версии в имя DLL-файла (как в случае с Linux-файлами .so).

Вы не сможете выполнить то, что вам нужно, если будете напрямую ссылаться на «MyDLL.dll», так как он будет искать библиотеки QT DLL (например, QtCore, QtGui и т. Д.). В стандартных библиотеках Qt нет имени версии в имени файла, поэтому возникнет конфликт относительно того, какой из них загрузить. Кроме того, вы, скорее всего, не сможете правильно связать в первую очередь (из-за конфликтов. Qt плохо работает со старыми версиями).

Единственная возможность может состоять в том, чтобы создать отдельный исполняемый файл, который связывается с Qt 4.6.0 и MyDLL, и использовать некоторую внешнюю связь между вашим основным приложением и сервером. COM может работать в этом случае, но это в значительной степени зависит от того, что на самом деле делает ваша dll.

Единственным другим способом действий было бы понизить версию вашего основного приложения и исправить его на Qt 4.6.0.

2

Ответ Джейсона С понял правильно. Также обратите внимание на следующее:

  1. MyDll.dll должен быть скомпилирован с той же версией компилятора, что и остальная часть вашего приложения.

  2. Версия Qt, используемая для сборки MyDll.dll, должна иметь те же основные флаги конфигурации, что и версия Qt, которую вы используете в настоящее время. Такие вещи, как пространства имен Qt, поддержка QThread и т. Д., Должны быть одинаковыми.

0
По вопросам рекламы [email protected]