2014-07-03 10 views
8

Ho un progetto QT che gira su x86 linux e ARM linux embedded (yocto). Per ogni piattaforma ho definito un kit all'interno di QtCreator facendo riferimento al compilatore appropriato ecc.File di progetto Qt: aggiungi librerie a seconda del Kit

Ora voglio aggiungere LIBS al mio file pro, ma ho ottenuto diverse librerie su ciascuna piattaforma. Non ho trovato un modo per specificare la direttiva LIBS dipendente dal Kit di compilazione.

che cerco qualcosa di simile:

if (Kit == "Desktop") 
    LIBS += ... 

if (Kit == "Embedded Yocto") 
    LIBS += ... 

come raggiungere questo obiettivo? Grazie in anticipo

+1

C'è un'altra risposta interessante qui: http://stackoverflow.com/questions/24912778/qtcreator-kit-specific-precompiler-macro-definitions – vsz

risposta

3

ho raschiato insieme una soluzione al Problema dell'OP utilizzando la risposta suggerita da @vsz nei commenti trovati here.

Ho due kit, uno per il desktop locale e uno per il dispositivo Target_ARM, e volevo un modo per creare facilmente per entrambi senza dover modificare appositamente il file .pro o qualsiasi altra cosa. Ho seguito la risposta legata e ha aggiunto il seguente:

  • nel mio kit desktop (sia per il debug e rilascio), ho aggiunto CONFIG+=Desktop come un ulteriore qmake argomento nella fase qmake build.
  • Per il kit Target_ARM, ho aggiunto CONFIG+=Target_ARM nello stesso punto.

Ora, questo è il punto in cui le cose sono passate dalla risposta collegata al problema dell'OP. Non volevo semplicemente variabili #define nel mio codice, volevo modificare il comportamento di qmake in base al kit selezionato. Non so se la funzione di test integrata CONFIG supporti o meno le denominazioni del blocco (ad esempio, CONFIG { _several lines here_ }), ma è risultato che potevo copiare e incollare la funzione di prova CONFIG davanti a ciascuna riga che volevo essere condizionale; infatti ho potuto stringa multipla CONFIG s insieme, in questo modo:

CONFIG(Desktop, Desktop|Target_ARM):unix:!macx:CONFIG(debug, debug|release): LIBS += /path/to/Desktop/debug/lib 
else:CONFIG(Desktop, Desktop|Target_ARM):unix:!macx:CONFIG(release, debug|release): LIBS += /path/to/Destop/release/lib 

Come suggerisce, l'istruzione precedente verrà eseguito qmake con il percorso appropriato LIBS seconda del kit e configurazione ho selezionato. Desktop->debug genererà un Makefile con /path/to/Desktop/debug/lib mentre Desktop->release genererà un Makefile con /path/to/Desktop/release/lib. Ho dichiarazioni simili per il kit Target_ARM. Di seguito è riportato un esempio di selezione del INCLUDEPATH corretto: entrambi i test verranno valutati su true quando è selezionato Target_ARM->release.

CONFIG(Target_ARM, Desktop|Target_ARM):CONFIG(release, debug|release): INCLUDEPATH += /include/path/for/Target_ARM/release 

In tutto, ho usato questo metodo per modificare LIBS, INCLUDEPATH, DEPENDPATH, and PRE_TARGETDEPS.Ho 4 possibili configurazioni di includere percorsi e librerie a seconda del kit che seleziono (Desktop o Target_ARM) e quale configurazione di configurazione seleziono (build o release). Una volta impostato, non è necessario modificare il file .pro, selezionare semplicemente il kit, la configurazione di build, eseguire qmake, quindi ricostruire.

Non so in cima alla mia testa dove sono memorizzati i dati CONFIG+=Desktop (ad esempio), ma suppongo nel file .pro.user. Quindi, se qualcuno preleva il tuo file .pro da un repo, potrebbe dover configurare inizialmente il progetto in questo modo almeno una volta, ma non in seguito (finché il file .pro.user persiste). QT dovrebbe davvero avere un meccanismo semplice per fare questo front-and-center, soprattutto perché uno dei loro punti vendita è l'integrazione multipiattaforma. Se c'è un modo migliore per farlo, non l'ho ancora visto su SO o nella documentazione di QT.

1

Hai tutte le variabili QMake qui: qt-project.org/doc/qt-4.8/qmake-function-reference.html

È possibile definire una variabile

KIT = Desktop 
#KIT = EmbeddedYocto 

E all'uso contiene funzione

contains(KIT, Desktop) { 
    LIBS += ... 
} 
contains(KIT, EmbeddedYocto) { 
    LIBS += ... 
} 
+1

Grazie per la risposta. Quindi cambierei l'assegnazione della variabile KIT quando cambio la piattaforma di destinazione ... In realtà speravo di poter interrogare il KIT attualmente selezionato da QtCreator dalle opzioni di costruzione. – mbue

0
MY_QT_INSTALL_PREFIX=$$[QT_INSTALL_PREFIX] 
equals(MY_QT_INSTALL_PREFIX,"C:/Qt/Qt5.3.1/5.3/msvc2010_opengl"){ 
message($$[QT_INSTALL_PREFIX]) 
} 
Problemi correlati