У меня есть приложение 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. Оказалось, что это сработало в этом случае, но вопрос стоит.
У вас не должно быть проблем. Qt поддерживает бинарную совместимость с небольшими выпусками и выпусками исправлений (см. http://qt-project.org/wiki/Qt-Version-Compatibility) и приложение / DLL, созданное с использованием 4.6.x, будет нормально работать, если привязано к среде выполнения 4.8.x.
Если вы видите проблемы, это из-за чего-то другого, и вам нужно будет уточнить, какие именно у вас проблемы.
Если вы не видите проблем и просто задаете вопрос превентивно, то 1) просто действуйте как обычно, без особых соображений, и 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.
Ответ Джейсона С понял правильно. Также обратите внимание на следующее:
MyDll.dll должен быть скомпилирован с той же версией компилятора, что и остальная часть вашего приложения.
Версия Qt, используемая для сборки MyDll.dll, должна иметь те же основные флаги конфигурации, что и версия Qt, которую вы используете в настоящее время. Такие вещи, как пространства имен Qt, поддержка QThread и т. Д., Должны быть одинаковыми.