2011-01-29 21 views
31

In base a qt.nokia.com, Qt è una "applicazione multipiattaforma e un framework UI" che consente di "scrivere codice una volta per indirizzare più piattaforme". Qt SDK è un "ambiente di sviluppo completo" contenente "gli strumenti necessari per creare applicazioni multipiattaforma con Qt in un'unica installazione". Qt Creator è un "IDE multipiattaforma" che "funziona su sistemi operativi desktop Windows, Linux/X11 e Mac OS X e consente agli sviluppatori di creare applicazioni per più piattaforme desktop e dispositivi mobili".Best practice per lo sviluppo "multipiattaforma" con Qt

Le parole magiche "cross compilation" non sono menzionate esplicitamente quelle pagine del sito web. Tuttavia, un lettore ingenuo potrebbe essere perdonato per aver dedotto che è possibile scaricare l'SDK Qt (incluso Qt Creator) per qualsiasi sistema host che si sta utilizzando per lo sviluppo, creare un progetto e scrivere del codice da cui si potrebbe facilmente generare Windows, Linux, Mac, ecc. Con "facilmente" ho in mente qualcosa come spuntare alcune checkbox in una finestra di dialogo delle impostazioni di build e premere il pulsante "Costruisci".

Sto ancora cercando quelle caselle di controllo! Nel frattempo, ho trovato vari post, qui e altrove, sull'installazione di un cross-compiler, sull'installazione di binari aggiuntivi, sulla riscrittura del file qmake, ecc. Dal marketing, mi aspettavo che la cross-compilation fosse già completamente e direttamente supportata con un'installazione "pronta all'uso" degli strumenti IDE e SDK. Mi manca qualcosa di ovvio?

In caso contrario, sono disponibili macchine di sviluppo con tutti e tre i sistemi operativi. Devo installare Qt Creator su tutte e tre le piattaforme? Se lo faccio, posso aspettarmi di poter prendere un progetto Qt (o forse solo il codice sorgente) che ho sviluppato usando Qt Creator per, per esempio, Windows, copiarlo sul mio Mac o Linux, e costruirlo usando la versione di Qt Creator per quella piattaforma, senza incorrere in alcuni problemi importanti? Potrebbe essere anche la migliore pratica per usare Qt per creare eseguibili per piattaforme mutiple, o installare strumenti cross-compilation su un singolo host di sviluppo?

+1

Grazie a tutti per le risposte veloci ... Come indicato nel titolo originale, penso che questa sia una "domanda molto semplice", ma importante. A volte le domande di base non vengono affrontate nella nostra impazienza per i dettagli. Dalle risposte iniziali, sembra che ci sia una serie di opinioni sulle migliori pratiche per l'utilizzo di Qt come soluzione per lo sviluppo di un'applicazione per più piattaforme. –

risposta

21

slogan di Qt è:

write once, compilare ovunque.

Con questo in mente, Qt non offre ufficialmente alcuna soluzione pronta per la cross-compilazione delle applicazioni Qt da una piattaforma specifica ad altre piattaforme diverse. Anche se sicuramente fattibile, se si investono molto tempo e lavoro, una buona pratica comune ti suggerirebbe di costruire la tua applicazione Qt direttamente sulla piattaforma mirata. Ciò significa che il tuo obiettivo Windows per la tua applicazione è una macchina Windows, il tuo Mac su una macchina Mac e Linux su una, hai indovinato (:-)), una macchina Linux.

Questo è modo "write once, compilare ovunque", a mio parere è una combinazione molto ben scelto di parole. Altrimenti la tag line potrebbe essere stata, "Scrivi una volta, compila per tutto".

Tornando al problema originale, non è nemmeno necessario disporre di macchine fisiche diverse per ciascuna delle piattaforme di destinazione, dal momento che in questa epoca di buone soluzioni di virtualizzazione è possibile configurare facilmente un paio di macchine virtuali e creare app su piattaforme diverse dalla stessa macchina fisica.

Per quanto riguarda le altre questioni non direttamente risposta dalla tua domanda:

devo solo installare Qt Creator su tutte e tre le piattaforme? Se lo faccio, posso posso prendere un progetto Qt (o forse solo il codice sorgente ) che ho sviluppato usando Qt Creator per, diciamo, Windows, copiarlo sul mio Mac o Linux macchina, e lo compila lì usando la versione di Qt Creator per quella piattaforma, senza correndo in alcuni grossi problemi?

Sì. Problemi minori sono cose come ottenere le icone eseguibili/binari delle applicazioni direttamente su tutte e tre le piattaforme principali (Windows, Linux, Mac) o l'integrazione avanzata di Mac Dock o la barra delle applicazioni Problemi di integrazione tra i due. Questi problemi possono essere gestiti senza rompere le caratteristiche multipiattaforma del codice, incapsulando correttamente il codice specifico della piattaforma nelle direttive del compilatore come #define per es. Raccomando anche di farlo per ogni altro codice specifico della piattaforma richiesto dall'applicazione o se si farà ampio uso del codice specifico della piattaforma, separando interi blocchi del relativo codice specifico della piattaforma in diverse librerie dinamiche caricate (o librerie condivise) specifiche per ciascuna piattaforma ma esportando la stessa interfaccia generica astratta e caricandoli/collegandoli secondo necessità.

Potrebbe essere che anche la migliore pratica per l'utilizzo di Qt per creare eseguibili per le piattaforme mutiple, contro l'installazione di strumenti cross-compilazione su un singolo host di sviluppo ?

Si dovrebbe usare il Qt SDK (Qt Creator o gli strumenti da riga di comando) per costruire la vostra applicazione per quanto possibile in quanto strumenti come qmake prenderà l'onere di gestire .moc file manualmente nel vostro Makefiles. Ma se ciò diventa impossibile per diversi motivi, ad es. come la tua azienda che impone lo sviluppo di Visual Studio (cross-platform huh?), ci sono molti tutorial su come gestire le build basate su Qt usando sistemi di compilazione come MS Visual Studio, GNU autotools o CMake. Anche se raccomanderei di attenersi a qmake, che è un buon generatore di makefile e facilmente adattabile a qualunque tipo di hack specifico per la piattaforma che si potrebbe desiderare per l'applicazione, piuttosto che utilizzare un sistema di build più comodo per la piattaforma specifica hack e poi cerca di soddisfare le esigenze di Qt per quei sistemi di compilazione. Dopotutto, se sviluppi la tua applicazione in Qt per motivi cross-platform, allora Qt dovrebbe essere il framework primario per la tua applicazione e non le API/codici specifici della piattaforma o le librerie di terze parti che potresti usare.

Spero di essere stato abbastanza chiaro e utile.

PS: Sono anche ben accetto a suggerimenti o correzioni/aggiunte riguardanti ciò che ho scritto nei commenti.

+0

Non riesco a compilare ragionevolmente applicazioni che abbiano come target android _on_ android. Questa argomentazione va a pezzi per i dispositivi mobili. – Wyatt8740

2

L'ultima volta che stavo usando Qt, ed era anni fa, dovevi compilare su ogni piattaforma per cui volevi un binario. Ovviamente potresti compilare una croce, ma penso che spetti a te creare una cosa del genere.

Forse qualcun altro fornirà una domanda migliore, ma non credo che manchi qualcosa.

+0

Meglio ** domanda **? –

2

Non so sui sistemi Linux. Ma per sviluppare l'app Qt per Mac OS X e Windows, è necessario un computer di sviluppo per ciascuno di essi. Non c'è cross-compiling per i due.

Qt è multipiattaforma nel senso che gli stessi file sorgente possono creare app per piattaforme diverse. Con tutte le macchine virtuali disponibili, una configurazione (fisica) della macchina per sviluppare e costruire più obiettivi non dovrebbe essere un problema troppo grande. In effetti, questo è esattamente il modo in cui sto lavorando al mio attuale progetto che si rivolge sia a Mac che a Windows.

+1

È possibile eseguire la compilazione incrociata utilizzando il targeting mingw32 di Windows da un host Linux (http://lists.trolltech.com/qt-interest/2006-03/thread00351-0.html). Non so su MacOS X. –

3

Non penso che ci sia una configurazione cross-compile.

Circa la portabilità del progetto completo direi "quasi" perché ho trovato alcuni fastidiosi problemi tecnici. Tuttavia il tuo codice sorgente sarà portatile al 100% e la ricompilazione su un'altra piattaforma richiederà solo alcuni trucchi nel .pro.

Quello che faccio è lavorare con una sola piattaforma (Linux) e ogni tanto compilarlo usando la mia macchina Windows e il mio Mac Mini. Quello con cui normalmente mi trovo a combattere sono solo alcune direttive su dove trovare le librerie esterne o includere i file. Inoltre, quando lavoro su Mac, devo copiare i file esterni nel pacchetto dell'app in modo che il programma possa trovarli.

6

È possibile utilizzare MinGW per eseguire la cross-compilazione su Linux per Windows. La compilazione incrociata con Mac non è possibile a causa di problemi tecnici. Non c'è un mezzo facile per fare questo dalla GUI ma here è un bel how-to sulla compilazione incrociata di QtWebKit per Windows. Questo può essere applicato a qualsiasi progetto Qt.

1

La compilazione incrociata viene in genere utilizzata per lo sviluppo di software su un sistema Linux host e la compilazione per un sistema Linux di destinazione. Per anni ho usato un sistema Linux su un x86 con X11 (KDE) per compilare la nostra applicazione Qt per un sistema ARM embedded con Qt Embedded. Se fai app per dispositivi mobili, probabilmente stai eseguendo il cross-compiling. Ovviamente puoi compilare una compilazione su un sistema Windows. Tutto ciò di cui hai veramente bisogno è il cross-compilatore. Poiché gcc è disponibile nel codice sorgente, i cross-compilers gcc sono abbastanza comuni. Per eseguire la compilazione incrociata con Qt, è necessario un mkspec per qmake che specifica quali compilatori utilizzare.

Il tuo ultimo paragrafo indica che probabilmente non sarai in grado di eseguire questo tipo di compilazione incrociata - puoi farlo sul tuo computer Windows per Linux o probabilmente per Mac, e probabilmente lo puoi fare su Linux per Windows se stai usando la versione mingw di Qt su Windows, ma non compilerai mai un'applicazione basata su compilatore Microsoft su Linux o Mac per Windows.

Bottom line - fai ciò che hai indicato. Ottieni la tua fonte su ciascuna piattaforma di destinazione e compila lì.