【问题标题】:Visual Studio compiled Qt Plugin doesn't load in release modeVisual Studio 编译的 Qt 插件在发布模式下不加载
【发布时间】:2011-03-16 19:13:16
【问题描述】:

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

模板 = 库
配置 += 插件
CONFIG += debug_and_release
包含路径 += ../
标题 = ExtraAnalysisTools.h
来源 = ExtraAnalysisTools.cpp
目标 = AKL_ExtraAnalysisTools
DESTDIR = ./

build_pass:CONFIG(debug, debug|release) {
unix:目标 = $$join(TARGET,,,_debug)
否则:目标 = $$join(目标,,,d)
}
CONFIG(debug,debug|release):message("调试模式")
CONFIG(release,debug|release):message("发布模式")
消息(配置 = $$CONFIG)

更新:我现在使用这个 .pro 文件并得到以下输出:

[1] - 项目消息:调试模式
[2] - 项目MESSAGE:CONFIG = YACC法调试warn_on UIC资源rtti_off exceptions_off stl_off incremental_off thread_off QT 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调试共享STL例外RTTI MMX 3DNOW SSE SSE2 def_files插件debug_and_release结果 [3] - 项目消息:调试模式
[4] - 项目MESSAGE:CONFIG =法YACC warn_on调试UIC资源rtti_off exceptions_off stl_off incremental_off thread_off窗口调试DebugBuild调试build_pass QT 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调试共享STL例外RTTI MMX 3DNOW SSE SSE2 def_files调试DebugBuild调试 build_pass 插件 debug_and_release
[5] - 项目消息:发布模式
[6] - 项目消息:CONFIG = lex yacc warn_on debug uic 资源 rtti_off exceptions_off stl_off incremental_off thread_off windows release ReleaseBuild Release 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> 共享 stl 异常 rtti mmx 3dnow sse sse2 def_files release ReleaseBuild Release build_pass plugin debug_and_release

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

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

非常感谢!快把我逼疯了xP

【问题讨论】:

  • 无论如何,我根本不掌握视觉工作室,所以也许我错过了项目设置中的一些内容
  • 你是不是在同一个目录下构建了debug和release插件?
  • 目前,是的,但我一次只构建一个,然后将其复制到我有调试和发布应用程序的目录。两个文件的大小也发生了变化,所以我用/不编译调试库......(至少 Qt 库......这只是我猜,因为我找不到在这台计算机上运行的一些类似 ldd 的程序) .

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


【解决方案1】:

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

在 Visual Studio 中,在项目设置下,您可以检查 Linker ->Input 并确保其中列出的库缺少“d”后缀(QtCored4.dll 是 debug,QtCore4.dll 是 release)。

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

【讨论】:

    【解决方案2】:

    我猜你的发布配置中缺少 QT_NO_DEBUG 预处理器标志。这就是为什么您的“发布”构建使用“调试”模式获取插件构建密钥的原因。而且您的解决方法真的很“讨厌”,因为每次插件修改后都会重新创建插件的注册表项

    【讨论】:

    • 嗯嗯没有。我对插件preprocesor标志是:QT_NO_DEBUG,NDEBUG,UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_DLL,QT_PLUGIN,QT_GUI_LIB,QT_CORE_LIB,QT_THREAD_SUPPORT而对于应用程序:UNICODE,WIN32,QT_LARGEFILE_SUPPORT,QT_THREAD_SUPPORT,QT_NO_DEBUG,NDEBUG,QT_CORE_LIB,QT_GUI_LIB关于解决方法, 我知道。我没有在生产中使用它,只是用来看看我是否能得到一些额外的线索。
    【解决方案3】:

    将以下行添加到您的 .pro 文件中,看看它会打印什么。显式的 CONFIG += 版本有点可疑。请记住,如果 debug 已经在 CONFIG 中,它会覆盖 release。

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

    如果它打印两个条目,则可能已经在其他地方进行了 CONFIG += 调试。

    【讨论】:

    • 感谢您的提示。它打印发布模式。我还使用调试和发布配置标志重新编译了我的 qt 库(尽管我认为它们已经使用该标志进行了编译)。但它不起作用。我发现的唯一解决方法是编辑 win 寄存器以修改插件 dll 入口字符串,将 debug 替换为 release。修改此入口后,我可以在发布模式下加载库。所以我猜Qt库是对的,我唯一需要做的就是找到谁是这个设置的负责人。
    • 你可以尝试在 Qt Creator 上编译来检查生成的 dll 是否被加载?
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-28
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多