Szukaj…
Domyślny profil.
qmake to narzędzie do automatyzacji kompilacji, które jest dostarczane ze środowiskiem Qt . Działa podobnie do narzędzi takich jak CMake lub GNU Autotools , ale został zaprojektowany specjalnie do użycia z Qt . Jako taki jest dobrze zintegrowany z ekosystemem Qt , w szczególności IDE Qt Creator .
Jeśli uruchomisz Qt Creator i wybierzesz File -> New File or Project -> Application -> Qt Widgets
, Qt Creator wygeneruje szkielet projektu wraz z plikiem „pro”. Plik „pro” jest przetwarzany przez qmake w celu generowania plików, które z kolei są przetwarzane przez bazowe systemy kompilacji (na przykład GNU Make lub nmake ).
Jeśli nazwa projektu to „myapp”, pojawi się plik „myapp.pro”. Oto jak wygląda taki domyślny plik z dodanymi komentarzami opisującymi każdą zmienną qmake .
# 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
Zachowanie źródłowej struktury katalogów w kompilacji (nieudokumentowana opcja „object_parallel_to_source”).
Jeśli chcesz zorganizować projekt, przechowując pliki źródłowe w różnych podkatalogach, powinieneś wiedzieć, że podczas kompilacji qmake nie zachowa tej struktury katalogów i zachowa wszystkie pliki „.o” w jednym katalogu kompilacji. Może to stanowić problem, jeśli masz sprzeczne nazwy plików w różnych katalogach, takich jak następujące.
src/file1.cpp
src/plugin/file1.cpp
Teraz qmake zdecyduje o utworzeniu dwóch plików „file1.o” w katalogu kompilacji, powodując zastąpienie jednego z nich innym. Buld zawiedzie. Aby temu zapobiec, możesz dodać opcję konfiguracji CONFIG += object_parallel_to_source
do pliku „pro”. Dzięki temu qmake wygeneruje pliki kompilacji, które zachowają strukturę katalogu źródłowego. W ten sposób katalog kompilacji będzie odzwierciedlał strukturę katalogu źródłowego, a pliki obiektowe będą tworzone w osobnych podkatalogach.
src/file1.o
src/plugin/file1.o
Kompletny przykład.
QT += core
TARGET = myapp
TEMPLATE = app
CONFIG += object_parallel_to_source
SOURCES += src/file1.cpp \
src/plugin/file1.cpp
HEADERS += src/plugin/file1.h
Zauważ, że object_parallel_to_source
CONFIG
opcja nie jest oficjalnie udokumentowane.
Prosty przykład (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();
}
przyklad.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.
Wiersz poleceń
# 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.
Przykład SUBDIRS
Zdolności SUBDIRS programu qmake można użyć do skompilowania zestawu bibliotek, z których każda zależy od innej. Poniższy przykład jest nieco skomplikowany, aby pokazać warianty ze zdolnością SUBDIRS.
Struktura katalogów
Niektóre z poniższych plików zostaną pominięte ze względu na zwięzłość. Można założyć, że są one formatem jako przykłady nie będące podkatalogami.
project_dir/
-project.pro
-common.pri
-build.pro
-main.cpp
-logic/
----logic.pro
----some logic files
-gui/
----gui.pro
----gui files
project.pro
To jest główny plik, który umożliwia przykład. Jest to również plik, który zostałby wywołany za pomocą qmake w wierszu poleceń (patrz poniżej).
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
(*) Zobacz dokumentację referencyjną dla innych opcji dla obiektu docelowego podkatalogów.
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
logic / 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
Wiersz poleceń
# 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.
Przykład biblioteki
Prosty przykład tworzenia biblioteki (zamiast domyślnego pliku wykonywalnego). Zmienna TEMPLATE
określa typ tworzonego projektu. Opcja lib
pozwala makefile zbudować bibliotekę.
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
Podczas budowania biblioteki możesz dodać do dll
CONFIG
opcje dll
(domyślnie), staticlib
lub plugin
.
Tworzenie pliku projektu z istniejącego kodu
Jeśli masz katalog z istniejących plików źródłowych, można użyć qmake
z -project
-Opcja aby utworzyć plik projektu.
Załóżmy, że folder MyProgram zawiera następujące pliki:
- main.cpp
- foo.h
- foo.cpp
- bar.h
- bar.cpp
- subdir / foobar.h
- subdir / foobar.cpp
Następnie dzwoniąc
qmake -project
plik MyProgram.pro jest tworzony z następującą zawartością:
######################################################################
# 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
Kod można następnie zbudować zgodnie z opisem w tym prostym przykładzie .