C++ Visual Studio编译的Qt插件不';t在释放模式下加载

C++ Visual Studio编译的Qt插件不';t在释放模式下加载,c++,visual-c++,visual-studio-2005,plugins,qt4,C++,Visual C++,Visual Studio 2005,Plugins,Qt4,我正在开发一个Qt应用程序和一个Qt插件库。只要我使用调试模式,一切都正常 然而,当我尝试在发布模式下编译时,插件不会加载。我从QPluginLoader收到以下错误消息: 预期生成密钥“Windows msvc发布完整配置”获得“Windows msvc调试完整配置” 我已经在VisualStudio2005中检查了所有项目配置设置,它们都处于发布模式,没有调试符号。编译器的输出还声明: 1> ----重新生成所有已启动:项目:ExtraAnalysisTools,配置:发布Win32----

我正在开发一个Qt应用程序和一个Qt插件库。只要我使用调试模式,一切都正常

然而,当我尝试在发布模式下编译时,插件不会加载。我从QPluginLoader收到以下错误消息:

预期生成密钥“Windows msvc发布完整配置”获得“Windows msvc调试完整配置”

我已经在VisualStudio2005中检查了所有项目配置设置,它们都处于发布模式,没有调试符号。编译器的输出还声明:

1> ----重新生成所有已启动:项目:ExtraAnalysisTools,配置:发布Win32------ 1> 正在删除项目“ExtraAnalysisTools”、配置“Release | Win32”的中间文件和输出文件

所以我不知道还能做什么。我尝试使用Dependency Walker,但由于某些原因,它无法加载文件(很抱歉,输出是日语…)

最后,这里是我用来生成插件项目的.pro文件

模板=lib
配置+=插件
配置+=调试和发布 INCLUDEPATH+=../
标题=ExtraAnalysisTools.h
来源=ExtraAnalysisTools.cpp
目标=AKL_外部分析工具
DESTDIR=。/

构建过程:配置(调试,调试|发布){
unix:TARGET=$$join(目标,,,\u调试)
其他:TARGET=$$join(TARGET,,,d)
}
配置(调试,调试|发布):消息(“调试模式”)
配置(释放,调试|释放):消息(“释放模式”)
消息(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 link_prl precompile_header autogen_precompile_source copy_dir_files debug_和_release debug_目标嵌入_manifest_dll嵌入_manifest_exe_共享stl异常rtti mmx 3dnow sse2 def_文件插件调试和发布
[3] -项目消息:调试模式
[4]-项目消息:CONFIG=lex yacc warn\u on debug uic resources rtti\u off exceptions\u off stl\u off incremental\u off thread\u off windows debug debug debug build debug build调试build\u pass qt warn\u on release incremental flat link\u prl precompile\u header autogen\u precompile\u source copy\u dir\u files debug\u release debug\u release debug\u and\u release目标嵌入清单\u dllembed_manifest_exe调试共享stl异常rtti mmx 3dnow sse2 def_文件调试调试生成调试生成通过插件调试和发布
[5] -项目消息:发布模式
[6]-项目消息:CONFIG=lex yacc warn\u ondebuguic资源rtti\u off exceptions\u off stl\u off incremental\u off thread\u off windows release release build release build\u pass qt warn\u on release incremental flat link\u prl precompile\u header autogen\u precompile\u源复制\u dir\u files debug\u和\u release debug\u发布调试和发布目标embed_manifest_dll embed_manifest_exe调试共享stl异常rtti mmx 3dnow sse2 def_文件发布发布发布发布发布发布发布发布发布发布通过插件调试和发布

我注意到发布模式中的debug标志,因此我还尝试将CONFIG-=debug和CONFIG-=debug调试添加到我的.pro文件中(还与+=release和+=debug\u和\u release结合使用)。但它不起作用

我希望有了这些额外的信息,我们可以更接近这个问题


多谢各位!它让我疯狂xP

将以下几行添加到.pro文件中,看看它将打印什么。显式的CONFIG+=版本有点可疑。请记住,若调试已经在配置中,它将覆盖发行版

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

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

原因是在发布配置中缺少QT\u NO\u debug预处理器标志。这就是为什么您的“发布”版本会以“调试”模式获得插件构建密钥。而且你的解决方法真的很“讨厌”,因为每次修改插件后都会重新创建插件的注册表项。实际上,这只是一个与Visual Studio配置相关的问题。我正在重新安排我的项目设置,以包括一个新的共享库,突然它工作了

虽然我使用debug和release编译插件的不同版本,但由于我用于将正确的Qt标志导入项目的qmake项目文件,两个版本的目标文件夹是公用的,可能混合了一些中间文件(dll文件不同)


我不能100%确定这是否是真正的原因,但如果您面临另一个类似于此的问题,请首先尝试使用不同的目标目录。

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

在visual studio中,在项目设置下,可以检查链接器->输入,并确保列出的库缺少“d”后缀(QtCored4.dll为debug,QtCore4.dll为release)


Creator中的.pro文件有点棘手,因为调试总是定义的(发布“覆盖”调试)。Qt make文档中到处都有关于使用调试和发布的警告。我建议一次只编译一个或另一个-我认为,这个标志带来的额外麻烦不值得。无论如何,我根本不精通visual studio,所以我可能错过了项目设置中的某些内容。您是否在同一目录中构建了调试和发布插件?目前,是的,但是我一次只构建一个,然后将它复制到调试和发布应用程序所在的目录中。两个文件的大小也会改变,因此我认为它们是用/out deb编译的