Скомпилированный Visual Studio плагин Qt не загружается в режиме выпуска - PullRequest
2 голосов
/ 16 июля 2010

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

Тем не менее, когда я пытаюсь скомпилировать в режиме выпуска, плагин не загружается.Я получил следующее сообщение об ошибке от QPluginLoader :

Ожидаемый ключ сборки "Windows msvc release full-config" получил "Windows msvc debug full-config".

Я проверил все параметры конфигурации моего проекта в Visual Studio 2005, и все они находятся в режиме выпуска и без символов отладки.Также выходные данные компилятора утверждают, что:

1> ------ Перестроить все запущено: Проект: ExtraAnalysisTools, Конфигурация: Выпуск Win32 ------ 1> Удаление промежуточного и выходногофайлы для проекта «ExtraAnalysisTools», конфигурация «Release | Win32»

Так что я не знаю, что еще делать.Я пытался использовать Dependency Walker, но по какой-то причине он не может загрузить файл (извините, вывод на японском языке ...)

Наконец, вот .pro-файл, который я использую для генерации проекта плагина

ШАБЛОН = lib
CONFIG + = плагин
CONFIG + = debug_and_release
INCLUDEPATH + = ../
HEADERS = ExtraAnalysisTools.h
SOURCES = ExtraAnalysisTools.cpp
TARGET = AKL_ExtraAnalysisTools
DESTDIR = ./

build_pass: CONFIG (отладка, отладка | выпуск) {
unix: TARGET = $$ join (TARGET),,, _ debug)
else: TARGET = $$ join (TARGET ,,, d)
}
CONFIG (отладка, отладка | выпуск): сообщение («Режим отладки»)
CONFIG (release, debug | release): message («Release mode»)
message (CONFIG = $$ CONFIG)

Обновление: теперь я использую этот файл .pro и получаю следующеевывод:

[1] - СООБЩЕНИЕ о проекте: режим отладки
[2] - СООБЩЕНИЕ о проекте: CONFIG = lex yacc warn_on отладка ресурсов uic rtti_off exceptions_off stl_off incremental_off thread_off windows qt предупреждение_on выпуск инкрементной плоской link_prl прекомпиляция_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe отладка разделяемого общего доступа - отладка в режиме * * * * Отладка в режиме реального времени * * * Отладка в режиме реального времени * в режиме реального времени * 2-й файл: отладка в режиме реального времени * * * * Путь к проекту - отладка * * * Отладка в режиме проекта * - отладка в режиме реального времени * * * Отладка в режиме Project * - отладка в режиме реального времени * * * Отладка в режиме Project * - отладка в режиме реального времени * 2 - пробная версия 2-й файл: отладка 2-го уровня - отладка в режиме * * * * * Путь к проекту: отладка *, тестирование в реальном времени * * Отладка в режиме Windows * - Отладка в режиме Windows * * 2СООБЩЕНИЕ: CONFIG = Lex Yacc warn_on отлаживать UIC ресурсы rtti_off exceptions_off stl_off incremental_off thread_off отладочные окна DebugBuild Debug build_pass кварты релиз warn_on инкрементный плоский link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe отладки совместно Сейнт исключения RTTI MMX 3DNow ссе sse2 def_files отлаживать DebugBuild Debug build_pass плагин debug_and_release
[5] - Проект MESSAGE: режим выпуска
[6] - Проект MESSAGE: CONFIG = lex yacc warn_on отладка ресурсы uic rtti_off exceptions_off stl_offincremental_off thread_off релиз Windows ReleaseBuild Release build_pass qt warn_on выпуск инкрементный flat link_prl прекомпиляция_header autogen_precompile_source копия_dir_files* Я заметил флаги debug в выпущенном режиме, поэтому я также попытался добавить отладку CONFIG - = debug и CONFIG - = Debug в мой файл .pro (также в сочетании с + = release и + = debug_and_release).Но это не сработало.

Надеюсь, с помощью этой дополнительной информации мы сможем приблизиться к проблеме.

Большое спасибо!Это сводит меня с ума xP

Ответы [ 4 ]

2 голосов
/ 30 сентября 2010

Вы получите эту ошибку, если скомпилируете свои плагины с библиотеками отладки, а ваш EXE с библиотеками релизов. Решение состоит в том, чтобы убедиться, что ваш исполняемый файл и dll скомпилированы с одинаковой конфигурацией (выпуск или отладка).

В Visual Studio в настройках проекта вы можете проверить Linker -> Input и убедиться, что в перечисленных там библиотеках отсутствует суффикс "d" (QtCored4.dll отлажен, QtCore4.dll выпущен).

.pro файлы в Creator немного сложнее, так как отладка всегда определяется (выпуск отладки "переопределения"). во всем Qt есть предупреждения о том, как использовать debug_and_release. Я бы порекомендовал просто компилировать один или другой за один раз - дополнительная проблема этого флага просто не стоит, imo.

1 голос
/ 20 июля 2010

Полагаю, вам не хватает флага препроцессора QT_NO_DEBUG в вашей версии релиза. Вот почему ваша сборка "release" получает ключ сборки плагина в режиме "debug". И ваш обходной путь действительно "противный", потому что записи реестра для плагинов воссоздаются после каждой модификации плагина

0 голосов
/ 28 июля 2010

Ну, на самом деле это была проблема, связанная только с настройкой Visual Studio. Я перестраивал настройки своего проекта, чтобы включить новую разделяемую библиотеку, и вдруг это сработало ...

Хотя я компилировал разные версии плагина с использованием отладки и выпуска, из-за файла проекта qmake, который я использовал для импорта правильных флагов Qt в проект, папка назначения была общей для обеих версий, возможно, смешивая некоторый промежуточный файл файлы были разные).

Я не уверен на 100%, является ли это реальной причиной, но если вы столкнулись с другой проблемой, похожей на эту, попробуйте сначала использовать другие каталоги назначения.

0 голосов
/ 16 июля 2010

Добавьте следующие строки в ваш файл .pro и посмотрите, что он будет печатать.Явный релиз CONFIG + = довольно подозрительный.Помните, что если отладка уже находится в CONFIG, она переопределяет выпуск.

CONFIG(debug,debug|release):message("Debug mode")
CONFIG(release,debug|release):message("Release mode")

Если он печатает обе записи, возможно, в другом месте уже есть CONFIG + = debug.

...