2010-07-16 72 views
2

我正在開發一個Qt應用程序和一個Qt插件庫。就我使用的調試模式而言,一切正常。Visual Studio編譯的Qt插件不能在發佈模式下加載

儘管如此,當我嘗試在發佈模式下編譯插件不加載。我得到了以下錯誤消息從QPluginLoader

期望的建造關鍵的「Windows MSVC釋放全配置」得到「的Windows MSVC調試全配置」。

我已經檢查了我在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(調試,調試|釋放){
UNIX:TARGET = $$加入(TARGET ,,, _調試)
其他:TARGET = $ $加入(TARGET ,,, d)
}
CONFIG(調試,調試|發佈):消息( 「調試模式」)
CONFIG(發佈,調試|發佈):消息( 「發行模式」)
消息(CONFIG = $$ CONFIG)

更新:我現在使用這個。親文件,並得到下面的輸出:

[1] - 悄悄話:調試模式
[2] - 悄悄話:CONFIG =的lex 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] - 項目MESSAGE:調試模式
[4] - 項目MESSAGE:CONFIG =法YACC warn_on調試UIC資源rtti_off exceptions_off stl_off incremental_off線程_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] - 項目MESSAGE:釋放模式
[6 ] - 悄悄話:CONFIG = YACC法warn_on 調試 UIC資源rtti_off exceptions_off stl_off incremental_off thread_off的Windows版本ReleaseBuild發佈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 調試 SH ARED STL例外RTTI MMX 3DNOW SSE SSE2 def_files釋放ReleaseBuild發佈build_pass插件debug_and_release

我注意到調試的發佈模式標誌,所以我也嘗試添加CONFIG - =調試和CONFIG - =調試調試到我的.pro文件(也結合+ = release和+ = debug_and_release)。但它沒有奏效。

我希望通過這些額外的信息我們可以更加接近這個問題。

非常感謝!這讓我瘋狂xP

+0

無論如何,我根本不掌握visual studio,所以也許我錯過了項目設置中的某些東西 – lokifacio 2010-07-16 06:32:19

+0

您是否在同一個目錄下創建了調試和發佈插件? – Lars 2010-07-16 07:05:58

+0

目前,是的,但我一次只創建一個,然後將其複製到我有調試和發佈應用程序的目錄中。 此外,這兩個文件的大小發生了變化,所以我將它們編譯爲/ out調試庫......(至少Qt庫......這只是我猜測,因爲我找不到在此計算機上運行的一些類似ldd的程序)。 – lokifacio 2010-07-16 07:39:16

回答

0

將以下幾行添加到.pro文件中,看看它會打印什麼。顯式的CONFIG + =釋放有點腥。請記住,如果調試已經在CONFIG中,它將覆蓋發佈。

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

如果它打印兩個條目,其他地方可能已經存在CONFIG + =調試。

+0

謝謝你的建議。它打印釋放模式。我也用調試和釋放配置標誌重新編譯了我的qt庫(儘管我認爲它們已經用該標誌編譯)。但它不起作用。 我發現唯一的工作是編輯win寄存器來修改插件dll入口字符串替換調試版本。修改此入口後,我可以在發佈模式下加載庫。所以我猜Qt庫是對的,我唯一需要做的就是找出誰是這個設置的負責人。 – lokifacio 2010-07-20 02:29:11

+0

你可以試着編譯Qt Creator來檢查生成的dll是否被加載? – andref 2010-07-20 22:09:55

1

我覺得你缺乏QT_NO_DEBUG預處理器標誌在你的發佈配置。這就是爲什麼你的「發佈」版本獲得「調試」模式的插件構建密鑰。而你的解決方法是真正的「討厭」,因爲每個插件修改後重新創建插件的註冊表項。

+0

嗯,沒有。 該插件我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 關於解決方法,我知道。我不會在生產中使用它,只會用於查看是否可以獲得一些額外的線索。 – lokifacio 2010-07-21 00:15:21

0

嗯,實際上這是一個只與Visual Studio配置有關的問題。我正在重新安排我的項目設置,以包括一個新的共享庫,並突然它的工作...

雖然我編譯不同版本的插件使用調試和發佈,因爲qmake項目文件,我用來導入正確的Qt標誌插入到項目中,目標文件夾對於兩個版本來說都很常見,可能會混合一些中間文件(dll文件不同)。

如果這是真正的原因,我不確定是否100%,但是如果您遇到與此類似的另一個問題,請先嚐試使用不同的目標目錄。

2

如果您使用調試庫和您的EXE與發佈庫一起編譯您的插件,您將會得到此錯誤。解決方案是確保您的可執行文件和dll被編譯爲相同的配置(發佈版或調試版)。

在Visual Studio中,在項目設置下,您可以檢查鏈接器 - >輸入並確保列出的庫缺少「d」後綴(QtCored4.dll爲debug,QtCore4.dll爲release)。

Creator中的.pro文件有點棘手,因爲調試總是定義的(釋放「覆蓋」調試)。那裏有關於使用debug_and_release的文檔的警告。我會建議一次編譯一個或另一個 - 該標誌的額外麻煩不值得,imo。

相關問題