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 .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow