2013-01-01 14 views
18

Ho aggiornato il mio codice progetto da Qt4 a Qt5. Usa CMake. La conversione è andata bene tranne una riga di comandi Cmake relativi a Qt. non riesco a trovare nella documentazione corrente, comeCome collegare QtMain in CMake con Qt5?

Come collegare con QtMain da CMake (con QT5)?

È l'unico bit mancante per convertire il mio progetto. Qualcuno può indicarmi un documento che spiega questo o spiegare come farlo con Qt5? Il mio codice Qt4 ha funzionato correttamente ma non riesco a trovare la macro Cmake per Qt5.

EDIT> Ecco il file CMake che ho in questo momento: https://bitbucket.org/klaim/aos_qt5/src/593c195c4c6889f6968d68fca018ef425783a063/tools/aosdesigner/CMakeLists.txt?at=wip_qt5

Tutte le macro necessarie CMake QT5 sono stati impostati in modo corretto I belive, l'unica cosa che non funzionano è il collegamento a QtMain che non fare nulla , come previsto dal momento che dovrebbe esserci un modo specifico per farlo Qt5 che non trovo nella documentazione Qt5.

È possibile sfogliare la cronologia dei file per vedere come funzionava con Qt4.

+0

Come funziona il vostro codice di collegamento corrente assomiglia? –

+0

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

+0

Qual è l'effettivo messaggio di errore o problema che si sta verificando? –

risposta

14

Dal Qt docs collegato, sembra che sia possibile trovare Qt5Core anziché Qt5Widgets. Ciò creerà un target importato denominato Qt5::WinMain. Da Qt docs:

I bersagli importati vengono creati per ciascun modulo Qt. Ciò significa che lo Qt5<Module>_LIBRARIES contiene un nome di una destinazione importata, piuttosto che un percorso verso una libreria.
...
Ogni modulo in Qt 5 ha un target libreria con la convenzione di denominazione 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)

Consiglio anche che è necessario rimuovere i due link_libraries chiamate dal momento che è un deprecated command e mi piacerebbe specificare CMake versione 2.8.9 anziché solo 2.8 come minimo richiesto nella parte superiore di CMakeLists.txt, dal that's required for qt5_use_modules.

+0

Il primo suggerimento non può funzionare in quanto non esiste una directory con un modulo WinMain. Il secondo funziona, ma poi genera un errore perché è una libreria statica ed è compilato con vs2010 e sto usando vs2012. Quindi la seconda parte è più completa dell'altra risposta, accetto questa risposta. Si prega di rimuovere la prima parte. – Klaim

5

EDIT: Grazie a Archi commento (vedi sotto), è sufficiente aggiungere

target_link_libraries(<your_app> Qt5::WinMain) 

o

target_link_libraries(<your_app> ${Qt5Core_QTMAIN_LIBRARIES}) 

nel CMakeLists.txt dell'applicazione. Entrambe le sintassi hanno funzionato per me.

+0

Secondo questa presentazione: https://qtconference.kdab.com/sites/default/files/slides/cmake.pdf $ {QT_QTMAIN_LIBS} non è richiesto, ma solo add_executable (exec WIN32 ...) – Archie

+0

@Archie I già aveva WIN32. Hai riscritto il mio file CMake? – Klaim

+0

@Tawene Non capisco cosa sia Qt5 :: WinMain? Un nuovo obiettivo? – Klaim

5

A partire da CMake 2.8.11 e Qt 5.1, il collegamento a Qt5 :: WinMain è automatico/implicito se si specifica WIN32 nella chiamata add_executable o in caso contrario si imposta la proprietà di destinazione WIN32_EXECUTABLE.

La presentazione al

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

con video a

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

descrive le caratteristiche che lo hanno reso in CMake 2.8.11.

Per di più su CMake con Qt vedere

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

+0

Si noti che l'aggiunta automatica della destinazione Qt5 :: WinMain è soggetta alla politica cmake 'POLICY CMP0020'. Il default è il vecchio comportamento (non aggiungerlo). – codeling

+0

Il tuo commento è fuorviante. Il comportamento predefinito è NUOVO se la versione cmake minima richiesta è 2.8.11. – steveire

+1

Da http://www.cmake.org/cmake/help/git-master/policy/CMP0020.html: "Questo criterio è stato introdotto in CMake versione 2.8.11. La versione di CMake 2.8.12.20140121-g1eb4d avverte quando la politica è non impostato e utilizza il comportamento OLD. Utilizzare il comando cmake_policy per impostarlo esplicitamente su OLD o NEW. " Quindi, come ho letto, almeno per la versione più recente, il valore predefinito è OLD, non importa quale sia la versione cmake minima richiesta - oppure il comportamento predefinito cambia a seconda della versione cmake richiesta? Se è così, qualsiasi fonte di documentazione per questo, o è non documentato? – codeling

Problemi correlati