Domanda

Ciao Stackoverflowers :)

Se costruisco un progetto di esempio Qt / Qmake (nel mio caso il " Orologio analogico "Esempio) e distribuirlo su un dispositivo che esegue iOS 7.1 Tutto è regolare: l'app esegue perfettamente sul dispositivo. Chapeau - La gente di Digia ha fatto un lavoro formidabile per integrare il toolchain ios nel flusso di lavoro QT.

Tuttavia, se trado il progetto QMake in un progetto cmake, le cose non vanno più levigate. Ho allegato l'esempio dell'orologio analogico dalla versione Qt-5.3.1 (vedi sotto) dove ho aggiunto un cmakelists.txt e uno script che esegue cmake per generare un progetto Xcode per iOS. Il progetto compila e anche collegamenti (dovevo aggiungere alcune librerie di collegamento aggiuntive, vedere il file sorgente cmake). Yay.

Ma ecco la trappola: l'app si schianta in fase di esecuzione con il seguente messaggio di errore:

.

Errore: impossibile caricare il plug-in piattaforma "iOS"

come commento in Questo tarch significa uno deve "forzare il carico" libqos tramite le impostazioni del progetto. Fare questo non ha migliorato molto la situazione, ha cambiato solo il messaggio di errore su:

.

Errore: stai creando QApplication prima di chiamare UIAPPLICAMEMAINMAIN. Se stai scrivendo un'applicazione iOS nativa e vuoi solo usare Qt per Parti dell'applicazione, un buon posto per creare qApplication proviene dall'interno 'ApplicationDidFinishLaunching' all'interno del tuo delegato UIAPLICATO.

Ho due domande:

    .
  • Qualcuno ha un'idea quale sia il problema con gli errori di runtime? So che qmake (e i corrispondenti ios mkspecs) fanno un bel po 'di magia. Ma come tradurlo in cmake?
  • Perché devo collegare diverse libs (Harfbuzzng, Qios, libpng e diversi framework iOS) manualmente al mio obiettivo? Non dovrebbe trovare_package (qt5 ...) Fai questo lavoro per me?

qui è il link a un file zip contenente il mio progetto Qt-cmake . La versione QT che sto usando è qt-5.3.1 per iOS.

Modifica : Ho scoperto che il campione QMake non funziona proprio come questo se lo fai fuori dalla struttura della cartella degli esempi di QT. Guarda direttamente il Qt Esempio: Percorso / TO / QT / Esempi / Widget / Widget / Analogclock.

È stato utile?

Soluzione

Dopo alcune ore di scavatura intorno ho trovato un modo come creare un progetto cmake per la mia domanda Qt per iOS. I suggerimenti principali ho ottenuto tramite Google e controllando l'output generato da QMake. Ho trovato gli script che effettivamente fanno l'intera magia e le parti applicate con le mie fonti cmake.

Questa è la ricetta che ha funzionato per me. Per motivi di completezza, ho aggiunto anche i passaggi di cui avevo già a conoscenza di quando ho pubblicato la domanda sopra:

    .
  • Introdurre cmake alla catena di utensili iOS. Vedi cmake / toolchain / ios.toolchain.cmake del mio progetto di esempio. Imposta diverse proprietà cmake e cerca gli strumenti e i quadri necessari. (Non ricordo più da dove ho quel file da - ma è usato anche in diversi altri progetti se hai google per questo.) Devi passare questo file di configurazione come argomento a cmake (vedi sotto).

  • Imposta diverse proprietà di destinazione del tuo eseguibile per trasformarlo in un pacchetto di app (iOS). Dovrebbe essere chiaro Si noti che ci sono un modello info.List.in che sarà completato da cmake.

  • correzione 1 : collegamento librerie e framework mancanti all'app manualmente in cmake. Per qualche ragione, find_package(Qt5 ...) non restituisce un elenco completo delle dipendenze. Molto probabile che mi manchi qualcosa qui, però.

  • correzione 2 : Assicurarsi di eseguire il caricamento delle libqosos per evitare il messaggio di errore sul plugin IOS mancante. In cmake:

    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -force_load ${YOUR_QT_ROOT_PATH}/plugins/platforms/libqios.a" )

  • fix 3 : rimuovere la chiave dello storyboard in info.plist.in. Questo passo non capisco in dettaglio. I mezzi è stato ispirato da questo post su stackoverflow.

    <key>UIMainStoryboardFile</key> <string>main</string>

  • correzione 4 : e ora la ciliegia in alto: per iOS devi rinominare la funzione principale () con una corrispondente versione formattata "C". Apparentemente, Qt viene fornito con il proprio punto di ingresso main e rinomina quello che hai scritto come qtmn(). Questa magia QMake viene eseguita da questo script: your / qt / root / percorso / mkspecs / macx-ios-clang / rename_main.sh. Non capisco la meccanica completa dietro questo in dettaglio. Nel mio caso, stavo bene con la ridenominazione della firma della funzione del principale:

    // Replace... int main(int argc, char *argv[])

    // ... with this line: extern "C" int qtmn(int argc, char *argv[])

qui è di nuovo lo stesso progetto che mi riferivo nella domanda , questa volta con le correzioni applicate dall'alto. Per costruire questo progetto semplicemente chiama build_ios.sh e aprire il file XCodeProj creato nella cartella Build.

Nota: le ipotesi di lavoro sono che è disponibile una versione corretta di XCode (5.1.1 nel mio caso) e che possiedi un'identità di firma valida (cambiarlo in cmakelists.txt!). Inoltre, nel mio progetto di esempio (vedi sotto) presumo OpenCV costruito per iOS è disponibile. Avevo bisogno di lavorare attorno a un problema di linker: c'erano alcuni oggetti mancanti da libpng che vengono spediti con opencv.

Spero che questo sia stato utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top