Evgenii Legotckoi
Evgenii LegotckoiOct. 16, 2015, 12:25 p.m.

Qt/C++ - Lesson 025. Creating Project Files

Project files contain all the information required by qmake to build your application, library, or plugin. Generally, you use a series of declarations to specify the resources in the project, but support for simple programming constructs enables you to describe different build processes for different platforms and environments.

Project File Elements

The project file format used by qmake can be used to support both simple and fairly complex build systems. Simple project files use a straightforward declarative style, defining standard variables to indicate the source and header files that are used in the project. Complex projects may use control flow structures to fine-tune the build process.

Variables

In a project file, variables are used to hold lists of strings. In the simplest projects, these variables inform qmake about the configuration options to use, or supply filenames and paths to use in the build process.

qmake looks for certain variables in each project file, and it uses the contents of these to determine what it should write to a Makefile. For example, the lists of values in the HEADERS and SOURCES variables are used to tell qmake about header and source files in the same directory as the project file.

Variables can also be used internally to store temporary lists of values, and existing lists of values can be overwritten or extended with new values.

The following snippet illustrates how lists of values are assigned to variables:

HEADERS = mainwindow.h paintwidget.h

The list of values in a variable is extended in the following way:

SOURCES = main.cpp mainwindow.cpp \
          paintwidget.cpp
CONFIG += console

Note: The first assignment only includes values that are specified on the same line as the

HEADERS
variable. The second assignment splits the values in the
SOURCES
variable across lines by using a backslash ().

The CONFIG variable is another special variable that qmake uses when generating a Makefile.


Variables list

The following table lists some frequently used variables and describes their contents.

  • CONFIG - General project configuration options.
  • DESTDIR - The directory in which the executable or binary file will be placed.
  • FORMS - A list of UI files to be processed by the user interface compiler (uic).
  • HEADERS - A list of filenames of header (.h) files used when building the project.
  • QT - A list of Qt modules used in the project.
  • RESOURCES - A list of resource (.qrc) files to be included in the final project.
  • SOURCES - A list of source code files to be used when building the project.
  • TEMPLATE - The template to use for the project. This determines whether the output of the build process will be an application, a library, or a plugin.

The contents of variables can be assigned to other variables by the substitution of two signs $ before the name of the other variables.

Whitespace

Usually, whitespace separates values in variable assignments. To specify values that contain spaces, you must enclose the values in double quotes:

DEST = "Program Files"

The quoted text is treated as a single item in the list of values held by the variable. A similar approach is used to deal with paths that contain spaces, particularly when defining the INCLUDEPATH and LIBS variables for the Windows platform:

win32:INCLUDEPATH += "C:/mylibs/extra headers"
unix:INCLUDEPATH += "/home/user/extra headers"

Comments

You can add comments to project files. Comments begin with the

#
character and continue to the end of the same line. For example:

# Comments usually start at the beginning of a line, but they
# can also follow other content on the same line.

Built-in Functions and Control Flow

qmake provides a number of built-in functions to enable the contents of variables to be processed. The most commonly used function in simple project files is the include() function which takes a filename as an argument. The contents of the given file are included in the project file at the place where the

include
function is used. The
include
function is most commonly used to include other project files:

include(other.pro)

Support for conditional structures is made available via scopes that behave like

if
statements in programming languages:

win32 {
    SOURCES += paintwidget_win.cpp
}

The assignments inside the braces are only made if the condition is true. In this case, the

**win32**
CONFIG option must be set. This happens automatically on Windows . The opening brace must stand on the same line as the condition.

More complex operations on variables that would usually require loops are provided by built-in functions such as find() , unique() , and count() . These functions, and many others are provided to manipulate strings and paths, support user input, and call external tools.

Project Templates

The TEMPLATE variable is used to define the type of project that will be built. If this is not declared in the project file, qmake assumes that an application should be built, and will generate an appropriate Makefile (or equivalent file) for the purpose.

The following table summarizes the types of projects available and describes the files that qmake will generate for each of them:

  • app (default) - Makefile to build an application.
  • lib - Makefile to build a library.
  • aux - Makefile to build nothing. Use this if no compiler needs to be invoked to create the target, for instance because your project is written in an interpreted language. Note: This template type is only available for Makefile-based generators. In particular, it will not work with the vcxproj and Xcode generators.
  • subdirs - Makefile containing rules for the subdirectories specified using the SUBDIRS variable. Each subdirectory must contain its own project file.
  • vcapp - Visual Studio Project file to build an application.
  • vclib - Visual Studio Project file to build a library.
  • vcsubdirs - Visual Studio Solution file to build projects in sub-directories.

When the

subdirs
template is used, qmake generates a Makefile to examine each specified subdirectory, process any project file it finds there, and run the platform's
make
tool on the newly-created Makefile. The
SUBDIRS
variable is used to contain a list of all the subdirectories to be processed.

General Configuration

The CONFIG variable specifies the options and features that the project should be configured with.

The project can be built in release mode or debug mode, or both. If debug and release are both specified, the last one takes effect. If you specify the

debug_and_release
option to build both the debug and release versions of a project, the Makefile that qmake generates includes a rule that builds both versions. This can be invoked in the following way:

make all

Adding the build_all option to the CONFIG variable makes this rule the default when building the project.

Note: Each of the options specified in the

CONFIG
variable can also be used as a scope condition. You can test for the presence of certain configuration options by using the built-in CONFIG()function. For example, the following lines show the function as the condition in a scope to test whether only the
opengl
option is in use:

CONFIG(opengl) {
    message(Building with OpenGL support.)
} else {
    message(OpenGL support is not available.)
}

This enables different configurations to be defined for

release
and
debug
builds.

Note: Some of these options only take effect when used on the relevant platform.

  • qt - The project is a Qt application and should link against the Qt library. You can use the
    QT
    variable to control any additional Qt modules that are required by your application. This value is added by default, but you can remove it to use qmake for a non-Qt project.
  • x11 - The project is an X11 application or library. This value is not needed if the target uses Qt.

Template applications and libraries provide you with more specialized settings of the assembly process. For example, if your application uses the Qt library and you want to build it in

debug
mode, your project file will contain the following line:

CONFIG += qt debug

Note: You must use "+=", not "=", or qmake will not be able to use Qt's configuration to determine the settings needed for your project.

Declaring Qt Libraries

If the CONFIG variable contains the

qt
value, qmake's support for Qt applications is enabled. This makes it possible to fine-tune which of the Qt modules are used by your application. This is achieved with the QT variable which can be used to declare the required extension modules. For example, we can enable the XML and network modules in the following way:

QT += network xml

Note:

QT
includes the
core
and
gui
modules by default, so the above declaration adds the network and XML modules to this default list. The following assignment omits the default modules, and will lead to errors when the application's source code is being compiled:

QT = network xml # This will omit the core and gui modules.

If you want to build a project without the

gui
module, you need to exclude it with the "-=" operator. By default,
QT
contains both
core
and
gui
, so the following line will result in a minimal Qt project being built:

QT -= gui # Only the core module is used.

Configuration Features

qmake can be set up with extra configuration features that are specified in feature (.prf) files. These extra features often provide support for custom tools that are used during the build process. To add a feature to the build process, append the feature name (the stem of the feature filename) to the

CONFIG
variable.

For example, qmake can configure the build process to take advantage of external libraries that are supported by pkg-config, such as the D-Bus and ogg libraries, with the following lines:

CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1

Declaring Other Libraries

If you are using other libraries in your project in addition to those supplied with Qt, you need to specify them in your project file.

The paths that qmake searches for libraries and the specific libraries to link against can be added to the list of values in the LIBS variable. You can specify the paths to the libraries or use the Unix-style notation for specifying libraries and paths.

LIBS += -L/usr/local/lib -lmath

The paths containing header files can also be specified in a similar way using the INCLUDEPATH variable.

INCLUDEPATH = c:/msdev/include d:/stl/include
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

alex_lip
  • Jan. 31, 2018, 12:56 a.m.

В главе

Объявление Qt библиотек - "Это желает возможным определять" - видимо опечатка -  "делает"

Evgenii Legotckoi
  • Jan. 31, 2018, 3:51 a.m.

Да, спасибо. Опечатка, вернее невнимательно работал с переводом.

d
  • Sept. 3, 2018, 9:07 a.m.

а можно как-то исключить xml и network? потому как QT -= network не помогает и сборка все-равно идет с модулем network

Evgenii Legotckoi
  • Sept. 5, 2018, 3:59 a.m.

Вы перезапускали qmake после добавленияQT -=xml network?

В данном случае нужно перезапустить qmake и лучше сделать чистую сборку
d
  • Sept. 14, 2018, 5:48 a.m.

добавляю QT -= xml network в файл проекта .pro

# make clean

# rm .qmake.stash Makefile

# qmake

# make



И все-равно в параметрах arm-linux-gnueabihf-g++ имеет место быть  -lQt5Quick -lQt5Gui -lQt5Qml -lQt5SerialPort -lQt5Core -lGLESv2 -lpthread


В 5.9 такого не было, возможно в 5.11 при использовании Serialport он сам еще и сеть подключает, даже и не знаю

Evgenii Legotckoi
  • Sept. 15, 2018, 6:29 a.m.

Как вариант, для SerialPort может использоваться внутренняя петля, loopback. Может поэтому и тянет с собой эти зависимости. Но это можно проверить, если запустить без этих библиотек собранный проект.

Есть ещё такая мысль, что это может быть багом. У нас на работе когда билд собирается, тоже тянет библиотеки, которые по идее не должны там присутствовать, например, тот же самый Qml, поскольку мы его не используем. Но если учесть, что сам софт занимает пару гигабайт, то пара лишних библиотек на пару десятков мегабайт уже никого не волнует.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
B

C++ - Test 002. Constants

  • Result:16points,
  • Rating points-10
B

C++ - Test 001. The first program and data types

  • Result:46points,
  • Rating points-6
FL

C++ - Test 006. Enumerations

  • Result:80points,
  • Rating points4
Last comments
k
kmssrFeb. 9, 2024, 5:43 a.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 9:30 p.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 7:38 p.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 19, 2023, 8:01 a.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
AC
Alexandru CodreanuJan. 19, 2024, 10:57 p.m.
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
BlinCT
BlinCTDec. 27, 2023, 7:57 p.m.
Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
Дмитрий
ДмитрийJan. 10, 2024, 3:18 p.m.
Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
Evgenii Legotckoi
Evgenii LegotckoiDec. 12, 2023, 5:48 p.m.
Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

Follow us in social networks