Visual Studio编译的Qt插件无法在发布模式下加载

时间:2010-07-16 06:31:12

标签: c++ visual-c++ visual-studio-2005 plugins qt4

我正在开发一个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文件

  

TEMPLATE = lib
   CONFIG + =插件
   CONFIG + = debug_and_release
   INCLUDEPATH + = ../
   HEADERS = ExtraAnalysisTools.h
   SOURCES = ExtraAnalysisTools.cpp
   TARGET = AKL_ExtraAnalysisTools
   DESTDIR = ./

     

build_pass:CONFIG(debug,debug | release){
       unix:TARGET = $$ join(TARGET ,,, _ debug)
       否则:TARGET = $$加入(TARGET ,,, d)
   }
   CONFIG(debug,debug | release):消息(“调试模式”)
   CONFIG(发布,调试|发布):消息(“发布模式”)
   消息(CONFIG = $$ CONFIG)

更新:我现在使用此.pro文件并获得以下输出:

  

[1] - 项目消息:调试模式
  [2] - 项目消息:CONFIG = lex yacc warn_on debug uic resources rtti_off exceptions_off stl_off incremental_off thread_off windows qt warn_on release incremental flat_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe debug shared stl exceptions rtti mmx 3dnow sse sse2 def_files plugin debug_and_release
  [3] - 项目消息:调试模式
  [4] - 项目消息:CONFIG = lex yacc warn_on debug uic resources rtti_off exceptions_off stl_off incremental_off thread_off windows debug DebugBuild Debug build_pass qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe debug shared stl exceptions rtti mmx 3dnow sse sse2 def_files debug DebugBuild调试build_pass插件debug_and_release
  [5] - 项目消息:发布模式
  [6] - 项目消息:CONFIG = lex yacc warn_on debug uic resources rtti_off exceptions_off stl_off incremental_off thread_off windows release ReleaseBuild发布build_pass qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe debug < / strong> shared stl exceptions rtti mmx 3dnow sse sse2 def_files release ReleaseBuild Release build_pass插件debug_and_release

我注意到发布模式下的 debug 标志,所以我也尝试将CONFIG - = debug和CONFIG - = Debug调试添加到我的.pro文件中(同时结合+ = release和+ = debug_and_release)。但它没有用。

我希望通过这些额外的信息,我们可以更接近问题。

非常感谢!这让我疯狂xP

4 个答案:

答案 0 :(得分:2)

如果使用调试库编译插件,并使用发行库编译EXE,则会出现此错误。解决方案是确保使用相同的配置(发布或调试)编译可执行文件和dll。

在visual studio中,在项目设置下,您可以检查链接器 - &gt;输入并确保其中列出的库缺少“d”后缀(QtCored4.dll是调试,QtCore4.dll是发布)。

Creator中的.pro文件有点棘手,因为总是定义调试(发布“覆盖”调试)。整个Qt的警告都有关于使用debug_and_release的文档。我建议一次只编译一个或另一个 - 这个标志的额外麻烦不值得,imo。

答案 1 :(得分:1)

我猜你在发布配置时缺少QT_NO_DEBUG预处理器标志。这就是为什么你的“发布”版本通过“调试”模式获得插件构建密钥的原因。并且您的解决方法实际上是“令人讨厌的”,因为插件的注册表项在每次插件修改后都会重新创建

答案 2 :(得分:0)

将以下行添加到.pro文件中,并查看它将打印的内容。明确的CONFIG + =发布有点可疑。请记住,如果调试已经在CONFIG中,它将覆盖release。

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

如果它打印两个条目,可能已经有其他地方的CONFIG + = debug。

答案 3 :(得分:0)

嗯,实际上这只是一个与Visual Studio配置有关的问题。我正在重新安排我的项目设置,以包括一个新的共享库,突然它工作了......

虽然我使用调试和发布编译了不同版本的插件,但由于qmake项目文件我曾经将正确的Qt标志导入到项目中,目标文件夹对于两个版本都很常见,可能会混合一些中间文件(dll文件不同)。

我不确定100%这是否是真正的原因,但如果您遇到与此类似的其他问题,请先尝试使用不同的目标目录。