Auf dieser Seite

Erweiterte Verwendung

Hinzufügen neuer Konfigurationsfunktionen

Mit qmake können Sie eigene „ features “ erstellen, die in Projektdateien eingebunden werden können, indem Sie deren Namen zur Liste der durch die Variable CONFIG angegebenen Werte hinzufügen. Features sind Sammlungen benutzerdefinierter Funktionen und Definitionen in „ .prf “-Dateien, die sich in einem von vielen Standardverzeichnissen befinden können. Die Speicherorte dieser Verzeichnisse sind an verschiedenen Stellen definiert, und qmake überprüft sie alle in der folgenden Reihenfolge, wenn es nach „ .prf “-Dateien sucht:

  1. In einem Verzeichnis, das in der Umgebungsvariable ` QMAKEFEATURES ` aufgeführt ist und eine Liste von Verzeichnissen enthält, die durch das Trennzeichen der Pfadliste der jeweiligen Plattform getrennt sind (Doppelpunkt unter Unix, Semikolon unter Windows).
  2. In einem Verzeichnis, das in der Eigenschaftsvariablen „ QMAKEFEATURES “ aufgeführt ist und eine Liste von Verzeichnissen enthält, die durch das Trennzeichen der Pfadliste der jeweiligen Plattform getrennt sind.
  3. In einem Verzeichnis „features“, das sich in einem Verzeichnis „ mkspecs “ befindet. Verzeichnisse „ mkspecs “ können sich unterhalb eines beliebigen der in der Umgebungsvariablen „ QMAKEPATH “ aufgeführten Verzeichnisse befinden, die eine durch das Pfadlistentrennzeichen der jeweiligen Plattform getrennte Liste von Verzeichnissen enthält. Beispiel: „ $QMAKEPATH/mkspecs/<features> “.
  4. In einem Verzeichnis „features“, das sich unterhalb des durch die Umgebungsvariable QMAKESPEC angegebenen Verzeichnisses befindet. Beispiel: $QMAKESPEC/<features>.
  5. In einem „features“-Verzeichnis, das sich im Verzeichnis „ data_install/mkspecs “ befindet. Zum Beispiel: data_install/mkspecs/<features>.
  6. In einem Verzeichnis „features“, das als gleichrangiges Verzeichnis neben dem durch die Umgebungsvariable „ QMAKESPEC “ angegebenen Verzeichnis existiert. Beispiel: $QMAKESPEC/../<features>.

Die folgenden „features“-Verzeichnisse werden nach Feature-Dateien durchsucht:

  1. features/unix, features/win32 oder features/macx, je nach verwendeter Plattform
  2. features/

Betrachten wir beispielsweise die folgende Zuweisung in einer Projektdatei:

CONFIG += myfeatures

Mit dieser Ergänzung der Variablen ` CONFIG ` durchsucht qmake nach dem Parsen Ihrer Projektdatei die oben aufgeführten Speicherorte nach der Datei ` myfeatures.prf `. Auf Unix-Systemen sucht es nach der folgenden Datei:

  1. $QMAKEFEATURES/myfeatures.prf (für jedes Verzeichnis, das in der Umgebungsvariable „ QMAKEFEATURES “ aufgeführt ist)
  2. $$QMAKEFEATURES/myfeatures.prf (für jedes in der Eigenschaftsvariablen ` QMAKEFEATURES ` aufgeführte Verzeichnis)
  3. myfeatures.prf (im Stammverzeichnis des Projekts). Das Projektstammverzeichnis wird durch die oberste „ .pro “-Datei bestimmt. Wenn Sie die „ .qmake.cache “-Datei jedoch in einem Unterverzeichnis oder im Verzeichnis eines Unterprojekts ablegen, wird das Unterverzeichnis selbst zum Projektstammverzeichnis.
  4. $QMAKEPATH/mkspecs/features/unix/myfeatures.prf sowie „ $QMAKEPATH/mkspecs/features/myfeatures.prf “ (für jedes in der Umgebungsvariable „ QMAKEPATH “ aufgeführte Verzeichnis)
  5. $QMAKESPEC/features/unix/myfeatures.prf und $QMAKESPEC/features/myfeatures.prf
  6. data_install/mkspecs/features/unix/myfeatures.prf und data_install/mkspecs/features/myfeatures.prf
  7. $QMAKESPEC/../features/unix/myfeatures.prf und $QMAKESPEC/../features/myfeatures.prf

Hinweis: Die „ .prf “-Dateien müssen Namen in Kleinbuchstaben haben.

Installieren von Dateien

Unter Unix ist es üblich, das Build-Tool auch zur Installation von Anwendungen und Bibliotheken zu verwenden, beispielsweise durch den Aufruf von ` make install`. Aus diesem Grund verfügt qmake über das Konzept eines „ install set “ – ein Objekt, das Anweisungen darüber enthält, wie ein Teil eines Projekts installiert werden soll. Eine Sammlung von Dokumentationsdateien lässt sich beispielsweise wie folgt beschreiben:

documentation.path = /usr/local/program/doc
documentation.files = docs/*

Das Element „ path “ teilt qmake mit, dass die Dateien in „ /usr/local/program/doc “ (das Element „path“) installiert werden sollen, und das Element „ files “ gibt die Dateien an, die in das Installationsverzeichnis kopiert werden sollen. In diesem Fall wird der gesamte Inhalt des Verzeichnisses „ docs “ nach „ /usr/local/program/doc “ kopiert.

Sobald ein Installationssatz vollständig beschrieben wurde, können Sie ihn mit einer Zeile wie dieser an die Installationsliste anhängen:

INSTALLS += documentation

qmake sorgt dafür, dass die angegebenen Dateien in das Installationsverzeichnis kopiert werden. Wenn Sie mehr Kontrolle über diesen Vorgang benötigen, können Sie auch eine Definition für das Element „ extra “ des Objekts angeben. Die folgende Zeile weist qmake beispielsweise an, eine Reihe von Befehlen für diesen Installationssatz auszuführen:

unix:documentation.extra = create_docs; mv master.doc toc.doc

Der Geltungsbereich „ unix “ stellt sicher, dass diese speziellen Befehle nur auf Unix-Plattformen ausgeführt werden. Entsprechende Befehle für andere Plattformen können mithilfe anderer Geltungsbereichsregeln definiert werden.

Die im Element „ extra “ angegebenen Befehle werden ausgeführt, bevor die Anweisungen in den anderen Elementen des Objekts ausgeführt werden.

Wenn Sie der Variablen „ INSTALLS “ ein integriertes Installationsset anhängen und keine „ files “- oder „ extra “-Mitglieder angeben, entscheidet qmake für Sie, was kopiert werden muss. Derzeit werden die Installationssets „ target “ und „ dlltarget “ unterstützt. Beispiel:

target.path = /usr/local/myprogram
INSTALLS += target

In den obigen Zeilen weiß qmake, was kopiert werden muss, und übernimmt den Installationsprozess automatisch.

Hinzufügen benutzerdefinierter Ziele

qmake versucht, alle Aufgaben zu erfüllen, die von einem plattformübergreifenden Build-Tool erwartet werden. Dies ist oft nicht ideal, wenn Sie tatsächlich spezielle plattformabhängige Befehle ausführen müssen. Dies lässt sich durch spezifische Anweisungen an die verschiedenen qmake-Backends erreichen.

Die Anpassung der Makefile-Ausgabe erfolgt über eine objektorientierte API, wie sie auch an anderen Stellen in qmake zu finden ist. Objekte werden automatisch durch die Angabe ihrer Mitglieder definiert. Zum Beispiel:

mytarget.target = .buildfile
mytarget.commands = touch $$mytarget.target
mytarget.depends = mytarget2

mytarget2.commands = @echo Building $$mytarget.target

Die obigen Definitionen definieren ein qmake-Ziel namens „ mytarget “, das ein Makefile-Ziel namens „ .buildfile “ enthält, welches wiederum mit dem Befehl „ touch “ generiert wird. Schließlich legt das Element „ .depends “ fest, dass „ mytarget “ von „ mytarget2 “ abhängt, einem weiteren Ziel, das im Anschluss definiert wird. „ mytarget2 “ ist ein Dummy-Ziel. Es wird nur definiert, um einen Text auf der Konsole auszugeben.

Der letzte Schritt besteht darin, mithilfe der Variablen „ QMAKE_EXTRA_TARGETS “ qmake mitzuteilen, dass dieses Objekt ein zu erstellendes Ziel ist:

QMAKE_EXTRA_TARGETS += mytarget mytarget2

Das ist alles, was Sie tun müssen, um benutzerdefinierte Ziele tatsächlich zu erstellen. Natürlich möchten Sie vielleicht eines dieser Ziele mit dem qmake-Build-Ziel verknüpfen. Dazu müssen Sie lediglich Ihr Makefile-Ziel in die Liste von PRE_TARGETDEPS aufnehmen.

Benutzerdefinierte Zielspezifikationen unterstützen die folgenden Elemente:

ElementBeschreibung
commandsDie Befehle zur Generierung des benutzerdefinierten Build-Targets.
CONFIGSpezifische Konfigurationsoptionen für das benutzerdefinierte Build-Ziel. Kann auf „ recursive “ gesetzt werden, um anzugeben, dass im Makefile Regeln erstellt werden sollen, um das entsprechende Ziel innerhalb des für das Unterziel spezifischen Makefiles aufzurufen. Standardmäßig erstellt dieses Element einen Eintrag für jedes der Unterziele.
dependsDie vorhandenen Build-Ziele, von denen das benutzerdefinierte Build-Ziel abhängt.
recurseGibt an, welche Unterziele bei der Erstellung der Regeln im Makefile verwendet werden sollen, um das unterzielspezifische Makefile aufzurufen. Dieses Element wird nur verwendet, wenn „ recursive “ in „ CONFIG “ gesetzt ist. Typische Werte sind „Debug“ und „Release“.
recurse_targetGibt das Ziel an, das über das Makefile des Unterziels für die Regel im Makefile erstellt werden soll. Dieses Element fügt etwa Folgendes hinzu: ` $(MAKE) -f Makefile.[subtarget] [recurse_target]`. Dieses Element wird nur verwendet, wenn ` recursive ` in ` CONFIG` gesetzt ist.
targetDer Name des benutzerdefinierten Build-Ziels.

Hinzufügen von Compilern

Es ist möglich, qmake so anzupassen, dass es neue Compiler und Präprozessoren unterstützt:

new_moc.output  = moc_${QMAKE_FILE_BASE}.cpp
new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"
new_moc.input = NEW_HEADERS
QMAKE_EXTRA_COMPILERS += new_moc

Mit den obigen Definitionen können Sie einen direkten Ersatz für „moc“ verwenden, sofern einer verfügbar ist. Der Befehl wird für alle Argumente ausgeführt, die der Variablen „ NEW_HEADERS “ (aus dem Element „ input “) übergeben werden, und das Ergebnis wird in die durch das Element „ output “ definierte Datei geschrieben. Diese Datei wird zu den anderen Quelldateien im Projekt hinzugefügt. Zusätzlich führt qmake „ depend_command “ aus, um Abhängigkeitsinformationen zu generieren, und fügt diese Informationen ebenfalls dem Projekt hinzu.

Benutzerdefinierte Compiler-Spezifikationen unterstützen die folgenden Elemente:

ElementBeschreibung
commandsDie Befehle, die zur Erzeugung der Ausgabe aus der Eingabe verwendet werden.
CONFIGSpezifische Konfigurationsoptionen für den benutzerdefinierten Compiler. Einzelheiten finden Sie in der Tabelle „CONFIG“.
depend_commandGibt einen Befehl an, der zur Erzeugung der Liste der Abhängigkeiten für die Ausgabe verwendet wird.
dependency_typeGibt den Dateityp der Ausgabe an. Handelt es sich um einen bekannten Typ (z. B. TYPE_C, TYPE_UI, TYPE_QRC), wird die Datei entsprechend behandelt.
dependsGibt die Abhängigkeiten der Ausgabedatei an.
inputDie Variable, die die Dateien angibt, die mit dem benutzerdefinierten Compiler verarbeitet werden sollen.
nameEine Beschreibung der Funktion des benutzerdefinierten Compilers. Diese wird nur in einigen Backends verwendet.
outputDer Dateiname, der vom benutzerdefinierten Compiler erstellt wird.
output_functionGibt eine benutzerdefinierte qmake-Funktion an, die zur Festlegung des zu erstellenden Dateinamens verwendet wird.
variablesGibt an, dass die hier angegebenen Variablen durch $(QMAKE_COMP_VARNAME) ersetzt werden, wenn sie in der pro-Datei als $(VARNAME) referenziert werden.
variable_outDie Variable, der die aus der Ausgabe erstellten Dateien hinzugefügt werden sollen.

Das CONFIG-Element unterstützt die folgenden Optionen:

OptionBeschreibung
combineGibt an, dass alle Eingabedateien zu einer einzigen Ausgabedatei zusammengefasst werden.
target_predepsGibt an, dass die Ausgabedatei zur Liste der PRE_TARGETDEPS hinzugefügt werden soll.
explicit_dependenciesDie Abhängigkeiten für die Ausgabedatei werden ausschließlich aus dem „depends“-Element generiert und aus keiner anderen Quelle.
dep_existing_onlyJede Abhängigkeit, die aus `.depend_command` resultiert, wird auf ihre Existenz überprüft. Nicht vorhandene Abhängigkeiten werden ignoriert. Dieser Wert wurde in Qt 5.13.2 eingeführt.
dep_linesDie Ausgabe von `.depend_command` wird so interpretiert, dass pro Zeile eine Datei steht. Standardmäßig erfolgt eine Trennung anhand von Leerzeichen; diese Option wird nur aus Gründen der Abwärtskompatibilität beibehalten.
no_linkGibt an, dass die Ausgabe nicht zur Liste der zu verknüpfenden Objekte hinzugefügt werden soll.

Bibliotheksabhängigkeiten

Beim Verknüpfen mit einer Bibliothek verlässt sich qmake häufig darauf, dass die zugrunde liegende Plattform weiß, mit welchen anderen Bibliotheken diese Bibliothek verknüpft ist, und überlässt es der Plattform, diese einzubinden. In vielen Fällen reicht dies jedoch nicht aus. Wenn beispielsweise eine Bibliothek statisch verknüpft wird, werden keine anderen Bibliotheken verknüpft, und daher werden keine Abhängigkeiten zu diesen Bibliotheken erstellt. Eine Anwendung, die später gegen diese Bibliothek verlinkt, muss jedoch wissen, wo sie die Symbole finden kann, die die statische Bibliothek benötigt. qmake versucht, die Abhängigkeiten einer Bibliothek gegebenenfalls nachzuverfolgen, sofern Sie die Nachverfolgung explizit aktivieren.

Der erste Schritt besteht darin, die Abhängigkeitsverfolgung in der Bibliothek selbst zu aktivieren. Dazu müssen Sie qmake anweisen, Informationen über die Bibliothek zu speichern:

CONFIG += create_prl

Dies ist nur für die Vorlage „ lib “ relevant und wird bei allen anderen ignoriert. Wenn diese Option aktiviert ist, erstellt qmake eine Datei mit der Endung .prl, in der einige Metainformationen über die Bibliothek gespeichert werden. Diese Metadatei gleicht einer gewöhnlichen Projektdatei, enthält jedoch ausschließlich interne Variablendeklarationen. Bei der Installation dieser Bibliothek durch Angabe als Ziel in einer INSTALLS-Deklaration kopiert qmake die .prl-Datei automatisch in den Installationspfad.

Der zweite Schritt in diesem Prozess besteht darin, das Auslesen dieser Metainformationen in den Anwendungen zu ermöglichen, die die statische Bibliothek verwenden:

CONFIG += link_prl

Ist diese Option aktiviert, verarbeitet qmake alle Bibliotheken, auf die die Anwendung verlinkt, und ermittelt deren Metainformationen. qmake nutzt diese, um die relevanten Verknüpfungsinformationen zu ermitteln, wobei insbesondere Werte zur Liste der DEFINES sowie der LIBS in der Projektdatei der Anwendung hinzugefügt werden. Sobald qmake diese Datei verarbeitet hat, durchsucht es die neu eingeführten Bibliotheken in der Variablen ` LIBS ` und ermittelt deren abhängige `.prl`-Dateien, bis alle Bibliotheken aufgelöst sind. Zu diesem Zeitpunkt wird das Makefile wie gewohnt erstellt, und die Bibliotheken werden explizit mit der Anwendung verknüpft.

Die .prl-Dateien sollten ausschließlich von qmake erstellt werden und nicht zwischen Betriebssystemen übertragen werden, da sie plattformabhängige Informationen enthalten können.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.