2011-11-04 26 views

回答

0

這是(特別是在Windows上)的一個常見問題。安裝Qt SDK時,至少會得到2個具有相同名稱但不同版本的.dll。它發生了,你鏈接到預期的(dev-)庫,但在運行時使用Designer/Creator的版本。

避免這種情況的最簡單方法是將正確版本的dll與您的二進制文件(.exe和東西)一起部署到單獨的文件夾中。這可以通過修改您的構建腳本來實現。它取決於你的構建系統,通常是qmake/.pro或cmake/CMakeLists.txt。

至於CMake的,假定有一個包含路徑文件的環境變量MYQTDLLDIR被部署,您可以使用類似的東西:

configure_file($ENV{MYQTDLLDIR}/QtCore4.dll ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) 
configure_file($ENV{MYQTDLLDIR}/QtGui4.dll ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) 

文檔從cmake --help-full剝離:

configure_file複製文件到另一個位置並修改其內容 。

configure_file( [COPYONLY] [ESCAPE_QUOTES] [@ONLY])

複製一個文件到文件並替換在文件內容引用的變量 值。如果是相對路徑 ,則會針對當前源目錄進行評估。 必須是文件,而不是目錄。如果是 相對路徑,則會根據當前二進制文件 目錄對其進行評估。如果命名現有目錄,輸入文件 將以其原始名稱放置在該目錄中。

該命令將用CMake所確定的值替換輸入文件中引用爲 $ {VAR}或@ VAR @的任何變量。如果未定義變量
,則它將被替換爲無。如果指定了
COPYONLY,則不會發生可變擴展。如果指定了 ESCAPE_QUOTES,則任何替代引號都將被C風格 轉義。該文件將使用CMake 變量的當前值進行配置。如果指定了@ONLY,則只會替換@ VAR @
格式的變量,並且$ {VAR}將被忽略。這對於配置使用$ {VAR}的腳本的
很有用。取決於CMake中VAR的設置,任何#cmakedefine VAR都將被#define VAR或/ * #undef VAR */
取代。
#cmakedefine01 VAR的任何事件將與任何的#define VAR 1或 的#define VAR代替0>根據VAR是否計算爲TRUE或FALSE在 CMake的

至於QMAKE你可以使用INSTALLS(當調用make install時使用)或者在鏈接後執行「普通命令」。使用INSTALLS

mytarget.path = /output/path 
mytarget.files += /path/to/QtCore4.dll 
mytarget.files += /path/to/QtGui4.dll 
INSTALLS += mytarget 

QMAKE使用命令執行:

win32 { 
    EXTRA_BINFILES += \ 
     $${MYQTDLLDIR}/QtCore4.dll \ 
     $${MYQTDLLDIR}/QtGui4.dll 
    EXTRA_BINFILES_WIN = $${EXTRA_BINFILES} 
    EXTRA_BINFILES_WIN ~= s,/,\\,g 
     DESTDIR_WIN = $${DESTDIR} 
    DESTDIR_WIN ~= s,/,\\,g 
    for(FILE,EXTRA_BINFILES_WIN){ 
       QMAKE_POST_LINK +=$$quote(cmd /c copy /y $${FILE} $${DESTDIR_WIN}$$escape_expand(\n\t)) 
    } 
} 
+0

你會介意並詳細說明你提到的這個構建腳本。聽起來很有趣。 – smallB

+0

@smallB更新了我的答案 – mbx

4

這看起來像我正在建立對一個版本的Qt和在運行時與另一個版本鏈接。運行QtSDK維護工具並刪除不需要的任何版本的Qt Desktop。然後,您可能需要在正確的標題處重新指定Codeblocks。

我在猜測,如果你從Codeblocks內部運行,你必須明確指定在你運行新建的應用程序時使用哪個dll。如果是這樣,請確保它們是正確的版本(即用QT INSTALL DIR \ Desktop \ 4.7.x \ mingw \ bin替換它們[雖然我現在不在我的工作PC上,所以這條路徑可能會有點不對勁,只要確保你在正確的4.7.x文件夾中])。

說實話,如果你從Windows上運行,爲什麼不使用QtCreator?除了GDB集成方面略有不足之外,這很不錯,你會發現這樣的問題很難找到。

+0

謝謝,我用qtcreator的GUI設計和Qt特定代碼,並在CB業務邏輯。爲什麼?很少有理由,其中之一是我非常喜歡cb,並且不想停止使用它。 – smallB