2014-07-03 5 views
8

Ich habe ein QT-Projekt, das auf x86-Linux und ARM-Linux embedded (yocto) läuft. Für jede Plattform habe ich einen Kit innerhalb von QtCreator definiert, der auf den entsprechenden Compiler etc. verweist.Qt-Projektdatei: Hinzufügen von Bibliotheken abhängig von Kit

Jetzt möchte ich LIBS zu meiner Profildatei hinzufügen, aber ich habe auf jeder Plattform verschiedene Bibliotheken. Ich habe keine Möglichkeit gefunden, die LIBS-Direktive abhängig vom kompilierenden Kit anzugeben.

Ich suche so etwas wie:

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

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

Wie dies zu erreichen? Vielen Dank im Voraus

+1

Es gibt eine andere interessante Antwort hier: http://stackoverflow.com/questions/24912778/qtcrea-or-kit-specific-precompiler-macro-definitionen – vsz

Antwort

3

ich zusammen die eine Lösung geschabt OP-Problem durch Verwendung der Antwort vorgeschlagen von @ vsz in den Kommentaren gefunden here.

Ich habe zwei Kits, eine für den lokalen Desktop und eine für das Target_ARM-Gerät, und ich wollte eine Möglichkeit, einfach für beide zu bauen, ohne die Datei .pro oder etwas anderes zu ändern. Ich folgte die verknüpfte Antwort und fügte hinzu, die folgenden:

  • In meinem Desktop-Kit (für beide Debug und Release), habe ich CONFIG+=Desktop als zusätzliches qmake Argument in der qmake Build-Schritt.
  • Für das Target_ARM-Kit habe ich CONFIG+=Target_ARM an der gleichen Stelle hinzugefügt.

Nun, das ist, wo Dinge von der verknüpften Antwort auf das OP-Problem verschoben. Ich wollte nicht einfach #define ed Variablen in meinem Code, ich wollte das Verhalten von qmake basierend auf dem ausgewählten Kit ändern. Ich weiß nicht, ob die integrierte Testfunktion CONFIG Blockbezeichnungen unterstützt oder nicht (dh CONFIG { _several lines here_ }), aber es stellte sich heraus, dass ich die Testfunktion CONFIG vor jeder Zeile kopieren und einfügen konnte, die ich bedingt haben wollte; in der Tat könnte ich String mehrere CONFIG s zusammen, wie folgt aus:

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 

Wie es schon sagt, die obige Aussage qmake mit den entsprechenden LIBS Pfad je nachdem, welcher Kit und Konfiguration ausgeführt werde ich ausgewählt haben. Desktop->debug erzeugt ein Makefile mit /path/to/Desktop/debug/lib darin, während Desktop->release ein Makefile mit /path/to/Desktop/release/lib erzeugt. Ich habe ähnliche Aussagen für den Target_ARM Kit. Unten ist ein Beispiel für die Auswahl der richtigen INCLUDEPATH: Beide Tests werden als wahr ausgewertet, wenn Target_ARM->release ausgewählt ist.

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

Insgesamt habe ich diese Methode LIBS, INCLUDEPATH, DEPENDPATH, and PRE_TARGETDEPS zu ändern.Ich habe 4 mögliche Konfigurationen von Include-Pfaden und Bibliotheken, abhängig davon, welches Kit ich auswähle (Desktop oder Target_ARM) und welche Build-Konfiguration ich auswähle (build oder release). Sobald dies eingerichtet ist, besteht keine Notwendigkeit, die Datei .pro zu ändern, wählen Sie einfach Ihr Kit, Ihre Build-Konfiguration, führen Sie qmake, und dann neu erstellen.

Ich weiß nicht aus der Spitze meines Kopfes, wo die CONFIG+=Desktop (zum Beispiel) Daten gespeichert ist, aber ich würde in der Datei .pro.user erraten. Wenn also jemand Ihre .pro Datei aus einem Repo zieht, muss er möglicherweise das Projekt auf diese Weise mindestens einmal konfigurieren, aber nicht danach (solange die .pro.user Datei bestehen bleibt). QT sollte wirklich einen einfachen Mechanismus für diese Front-und-Center haben, zumal eines ihrer Verkaufsargumente Multiple-Plattform-Integration ist. Wenn es einen besseren Weg dafür gibt, habe ich es noch nicht in SO oder in der QT-Dokumentation gesehen.

1

Sie haben alle Qmake Variablen hier: qt-project.org/doc/qt-4.8/qmake-function-reference.html

Sie Variable einen

KIT = Desktop 
#KIT = EmbeddedYocto 
definieren

Und Verwendung enthält Funktion

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

Vielen Dank für Ihre Antwort. Also würde ich die KIT-Variablen-Zuweisung ändern, wenn ich die Zielplattform ändere ... Eigentlich hatte ich gehofft, dass ich das aktuell ausgewählte KIT von QtCreator aus den Build-Optionen abfragen könnte. – 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]) 
}