Zoeken…
Standaard profiel.
qmake is een build-automatiseringstool die wordt geleverd met Qt- framework. Het doet vergelijkbare functie voor tools zoals CMake of GNU Autotools, maar het is ontworpen om specifiek te worden gebruikt in combinatie met Qt. Als zodanig is het goed geïntegreerd met het Qt- ecosysteem, met name Qt Creator IDE.
Als u Qt Creator start en File -> New File or Project -> Application -> Qt Widgets
toepassing selecteert, genereert Qt Creator een projectskelet voor u samen met een "pro" -bestand. Het "pro" -bestand wordt verwerkt door qmake om bestanden te genereren, die op hun beurt worden verwerkt door onderliggende build-systemen (bijvoorbeeld GNU Make of nmake ).
Als u uw project "myapp" hebt genoemd, verschijnt het bestand "myapp.pro". Zo ziet zo'n standaardbestand eruit, met opmerkingen, die elke toegevoegde qmake- variabele beschrijven.
# Tells build system that project uses Qt Core and Qt GUI modules.
QT += core gui
# Prior to Qt 5 widgets were part of Qt GUI module. In Qt 5 we need to add Qt Widgets module.
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# Specifies name of the binary.
TARGET = myapp
# Denotes that project is an application.
TEMPLATE = app
# List of source files (note: Qt Creator will take care about this list, you don't need to update is manually).
SOURCES += main.cpp\
mainwindow.cpp
# List of header files (note: Qt Creator will take care about this list).
HEADERS += mainwindow.h
# List of "ui" files for a tool called Qt Designer, which is embedded into Qt Creator in newer versions of IDE (note: Qt Creator will take care about this list).
FORMS += mainwindow.ui
Bronmapstructuur behouden in een build (optie "object_parallel_to_source" zonder papieren).
Als u uw project wilt organiseren door bronbestanden in verschillende submappen te bewaren, moet u weten dat qmake tijdens een build deze mapstructuur niet behoudt en alle ".o" -bestanden in één build-directory bewaart. Dit kan een probleem zijn als u conflicterende bestandsnamen in verschillende mappen had, zoals hieronder.
src/file1.cpp
src/plugin/file1.cpp
Nu zal qmake besluiten om twee "file1.o" -bestanden in een build-directory te maken, waardoor een van hen door een andere wordt overschreven. De buld zal falen. Om dit te voorkomen, kunt u CONFIG += object_parallel_to_source
configuratie-optie toevoegen aan uw "pro" -bestand. Dit zal qmake vertellen om buildbestanden te genereren die uw brondirectorystructuur behouden. Op deze manier geeft uw buildmap de structuur van de bronmap weer en worden objectbestanden in afzonderlijke submappen gemaakt.
src/file1.o
src/plugin/file1.o
Compleet voorbeeld.
QT += core
TARGET = myapp
TEMPLATE = app
CONFIG += object_parallel_to_source
SOURCES += src/file1.cpp \
src/plugin/file1.cpp
HEADERS += src/plugin/file1.h
Merk op dat de object_parallel_to_source
CONFIG
object_parallel_to_source
niet officieel is gedocumenteerd .
Eenvoudig voorbeeld (Linux)
Window.h
#include <QWidget>
class Window : public QWidget
{
Q_OBJECT
public:
Window(QWidget *parent = Q_NULLPTR) : QWidget(parent) {}
}
main.cpp
#include <QApplication>
#include "Window.h"
int main()
{
QApplication app;
Window window;
window.show();
return app.exec();
}
example.pro
# The QT variable controls what modules are included in compilation.
# Note that the 'core' and 'gui' modules are included by default.
# For widget-based GUI applications, the 'widgets' module needs to be added.
QT += widgets
HEADERS = Window.h # Everything added to the HEADER variable will be checked
# to see if moc needs to run on it, and it will be run if
# so.
SOURCES = main.cpp # Everything added to the SOURCES variable will be compiled
# and (in the simple example) added to the resulting
# executable.
Opdrachtregel
# Assuming you are in a folder that contains the above files.
> qmake # You can also add the example.pro file if needed
> make # qmake creates a Makefile, this runs make on it.
> ./example # The name of the executable defaults to the .pro file name.
SUBDIRS voorbeeld
Het SUBDIRS-vermogen van qmake kan worden gebruikt om een set bibliotheken samen te stellen, die elk van elkaar afhankelijk zijn. Het onderstaande voorbeeld is enigszins ingewikkeld om variaties met het SUBDIRS-vermogen te tonen.
Directorystructuur
Sommige van de volgende bestanden zullen worden weggelaten in het belang van beknoptheid. Ze kunnen worden verondersteld het formaat te zijn als niet-subdir-voorbeelden.
project_dir/
-project.pro
-common.pri
-build.pro
-main.cpp
-logic/
----logic.pro
----some logic files
-gui/
----gui.pro
----gui files
project.pro
Dit is het hoofdbestand dat het voorbeeld mogelijk maakt. Dit is ook het bestand dat met qmake op de opdrachtregel zou worden aangeroepen (zie hieronder).
TEMPLATE = subdirs # This changes to the subdirs function. You can't combine
# compiling code and the subdirs function in the same .pro
# file.
# By default, you assign a directory to the SUBDIRS variable, and qmake looks
# inside that directory for a <dirname>.pro file.
SUBDIRS = logic
# You can append as many items as desired. You can also specify the .pro file
# directly if need be.
SUBDIRS += gui/gui.pro
# You can also create a target that isn't a subdirectory, or that refers to a
# different file(*).
SUBDIRS += build
build.file = build.pro # This specifies the .pro file to use
# You can also use this to specify dependencies. In this case, we don't want
# the build target to run until after the logic and gui targets are complete.
build.depends = logic gui/gui.pro
(*) Zie de referentiedocumentatie voor de andere opties voor een doelschijf.
common.pri
#Includes common configuration for all subdirectory .pro files.
INCLUDEPATH += . ..
WARNINGS += -Wall
TEMPLATE = lib
# The following keeps the generated files at least somewhat separate
# from the source files.
UI_DIR = uics
MOC_DIR = mocs
OBJECTS_DIR = objs
logica / logic.pro
# Check if the config file exists
! include( ../common.pri ) {
error( "Couldn't find the common.pri file!" )
}
HEADERS += logic.h
SOURCES += logic.cpp
# By default, TARGET is the same as the directory, so it will make
# liblogic.so (in linux). Uncomment to override.
# TARGET = target
gui / gui.pro
! include( ../common.pri ) {
error( "Couldn't find the common.pri file!" )
}
FORMS += gui.ui
HEADERS += gui.h
SOURCES += gui.cpp
# By default, TARGET is the same as the directory, so it will make
# libgui.so (in linux). Uncomment to override.
# TARGET = target
build.pro
TEMPLATE = app
SOURCES += main.cpp
LIBS += -Llogic -Lgui -llogic -lgui
# This renames the resulting executable
TARGET = project
Opdrachtregel
# Assumes you are in the project_dir directory
> qmake project.pro # specific the .pro file since there are multiple here.
> make -n2 # This makes logic and gui concurrently, then the build Makefile.
> ./project # Run the resulting executable.
Bibliotheek voorbeeld
Een eenvoudig voorbeeld om een bibliotheek te maken (in plaats van een uitvoerbaar bestand, dat is de standaardinstelling). TEMPLATE
variabele geeft het type project aan dat u maakt. lib
optie lib
kan makefile een bibliotheek bouwen.
library.pro
HEADERS += library.h
SOURCES += library.cpp
TEMPLATE = lib
# By default, qmake will make a shared library. Uncomment to make the library
# static.
# CONFIG += staticlib
# By default, TARGET is the same as the directory, so it will make
# liblibrary.so or liblibrary.a (in linux). Uncomment to override.
# TARGET = target
Wanneer u een bibliotheek bouwt, kunt u opties dll
(standaard), staticlib
of plugin
aan CONFIG
.
Een projectbestand maken op basis van bestaande code
Als u een map met de bestaande bronbestanden, kunt u gebruik maken qmake
met de -project
-optie om een project-bestand te maken.
Laten we aannemen dat de map MyProgram de volgende bestanden bevat:
- main.cpp
- foo.h
- foo.cpp
- bar.h
- bar.cpp
- subdir / foobar.h
- subdir / foobar.cpp
Dan door te bellen
qmake -project
een bestand MyProgram.pro is gemaakt met de volgende inhoud:
######################################################################
# Automatically generated by qmake (3.0) Mi. Sep. 7 23:36:56 2016
######################################################################
TEMPLATE = app
TARGET = MyProgram
INCLUDEPATH += .
# Input
HEADERS += bar.h foo.h subdir/foobar.h
SOURCES += bar.cpp foo.cpp main.cpp subdir/foobar.cpp
De code kan vervolgens worden gebouwd zoals beschreven in dit eenvoudige voorbeeld .