2013-01-01 59 views
18

我將我的項目代碼從Qt4升級到Qt5。它使用CMake。 除了與Qt相關的一行Cmake命令之外,轉換得到了很好的結果。 我無法當前文檔中發現,像如何鏈接CMake中的QtMain和Qt5?

如何從CMake的(與QT5)與QtMain鏈接?

它是唯一缺少位到我的項目轉換。 有人可以指我解釋這個文件或解釋如何使用Qt5嗎?我的Qt4代碼工作正常,但我無法找到Qt5的Cmake宏。

編輯>這裏是CMake的文件我都不得不時刻:https://bitbucket.org/klaim/aos_qt5/src/593c195c4c6889f6968d68fca018ef425783a063/tools/aosdesigner/CMakeLists.txt?at=wip_qt5

所有QT5必要的CMake宏已正確設置我相信,只有那些不工作的事情是鏈接到QtMain什麼也不做, ,正如預期的那樣,因爲應該有一個Qt5的具體方法,我沒有在Qt5文檔中找到它。

您可以瀏覽文件歷史記錄,查看它是如何與Qt4一起工作的。

+0

請問你目前的鏈接代碼是什麼樣子? –

+0

@FrankOsterfeld它是:https://bitbucket.org/klaim/aos_qt5/src/593c195c4c6889f6968d68fca018ef425783a063/tools/aosdesigner/CMakeLists.txt?at=wip_qt5 – Klaim

+0

什麼是您遇到的實際錯誤信息或問題? –

回答

14

Qt docs你聯繫,似乎你可以找到Qt5Core而不是Qt5Widgets。這將創建一個名爲Qt5::WinMain的導入目標。來自Qt docs

爲每個Qt模塊創建導入目標。這意味着Qt5<Module>_LIBRARIES包含導入目標的名稱,而不是庫的路徑。
...
使用Qt 5每個模塊都有一個圖書館的目標與命名約定Qt5::<Module>


             
  
    find_package(Qt5Widgets REQUIRED) 
   
find_package(Qt5Core REQUIRED) 
... 
add_executable(aosdesigner WIN32 ${AOSDESIGNER_ALL_FILES}) 
target_link_libraries(aosdesigner 
    ${Boost_LIBRARIES} 
    utilcpp 
    aoslcpp 
    Qt5::WinMain # <-- New target available via find_package (Qt5Core) 
) 

qt5_use_modules(aosdesigner Widgets)

我也建議你刪除你的兩個link_libraries電話,因爲它是一個deprecated command,我會指定CMake版本2.8.9而不是2.8版,因爲您的CMakeLists.txt的最低要求爲that's required for qt5_use_modules

+0

第一個建議不能工作,因爲沒有WinMain模塊的目錄。第二個工作,但它然後觸發一個錯誤,因爲它是一個靜態庫,它使用vs2010編譯,我使用vs2012。所以第二部分比其他答案更完整,我接受了這個答案。請刪除第一部分。 – Klaim

5

編輯:感謝Archi的評論(見下文),只需在您的應用程序的CMakeLists.txt

target_link_libraries(<your_app> Qt5::WinMain) 

target_link_libraries(<your_app> ${Qt5Core_QTMAIN_LIBRARIES}) 

補充。兩種語法都適用於我。

+0

根據此演示文稿:https://qtconference.kdab.com/sites/default/files/slides/cmake.pdf $ {QT_QTMAIN_LIBS}不是必需的,但只是add_executable(exec WIN32 ...) – Archie

+0

@Archie我已經有WIN32。你是否贊成我的CMake文件? – Klaim

+0

@Tawene我不明白什麼是Qt5 :: WinMain?一個新的目標? – Klaim

5

從CMake 2.8.11和Qt 5.1開始,如果在add_executable調用中指定WIN32,或者設置WIN32_EXECUTABLE目標屬性,則鏈接到Qt5 :: WinMain是自動/隱式的。

呈現在

https://devdays.kdab.com/wp-content/uploads/2012/cmake.pdf

視頻在

http://www.youtube.com/watch?feature=player_detailpage&v=GJ0kMsLbk6Q#t=751

描述這使它成爲CMake的2.8.11功能。

更多關於CMake的使用Qt看到

http://www.kdab.com/modern-cmake-with-qt-and-boost/

+0

請注意,Qt5 :: WinMain目標的自動添加受制於'POLICY CMP0020' cmake策略。默認是舊行爲(不添加它)。 – codeling

+0

您的評論具有誤導性。如果所需的最低cmake版本是2.8.11,則默認行爲是NEW。 – steveire

+1

來自http://www.cmake.org/cmake/help/git-master/policy/CMP0020.html:「此策略是在CMake 2.8.11版中引入的,CMake版本2.8.12.20140121-g1eb4d在策略是未設置並使用OLD行爲,請使用cmake_policy命令將其設置爲OLD或NEW。「所以,當我閱讀它時,至少對於最新版本,無論最低要求的cmake版本是什麼 - 默認行爲都是舊的,或者是根據所需的cmake版本而改變的默認行爲?如果是這樣,它的任何文檔來源,還是它沒有記錄? – codeling