Evgenii Legotckoi
Evgenii LegotckoiJuly 23, 2017, 4:05 a.m.

Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion

Write "Hello, World !!!" On Qt in the IDE CLion using the CMAKE build system. The emphasis on the fact that the project is being developed in IDE CLion was made because to work with the project it is necessary to make a small adjustment for working with CMAKE .

The result is the following application:


Configure the IDE CLion

After you create the project, you need to configure it to work with the Qt library, you need to configure the path to this library through the argument CMAKE_PREFIX_PATH.

To do this, go to the IDE settings. File -> Settings -> Build, Execution, Deployment -> CMake

Further in CMake Options through CMAKE_PREFIX_PATH we specify a way to libraries Qt for CMAKE . The full path to the libraries can be:

/home/user/Qt/5.9.1/gcc_64/lib/cmake

The entire prefix record will be as follows:

-DCMAKE_PREFIX_PATH=/home/user/Qt/5.9.1/gcc_64/lib/cmake

In the settings, this window will look like this.

CMakeLists.txt

In CMakeLists.txt, in addition to the information added by default, you will need to add the search and connect Qt libraries by using the find_package and target_link_libraries functions.

cmake_minimum_required(VERSION 3.8)
project(HelloWorld)

set(CMAKE_CXX_STANDARD 17)

# Include a library search using find_package() 
# via REQUIRED, specify that libraries are required
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Widgets REQUIRED)

set(SOURCE_FILES main.cpp)
add_executable(HelloWorld ${SOURCE_FILES})

# specify which libraries to connect
target_link_libraries(${PROJECT_NAME} Qt5::Core)
target_link_libraries(${PROJECT_NAME} Qt5::Gui)
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)

main.cpp

Otherwise, writing the first HelloWorld will be a similar development under Qt Creator.

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QLabel>

int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    QWidget widget;
    widget.resize(640, 480);
    widget.setWindowTitle("Hello, world!!!");

    QGridLayout *gridLayout = new QGridLayout(&widget);

    QLabel * label = new QLabel("Hello, world!!!");
    label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
    gridLayout->addWidget(label);

    widget.show();

    return app.exec();
}

When developing under Qt Creator using the CMake build system, I did not like the fact that when you add files to a project, Qt Creator does not register them in CMakeLists.txt, that is, files are created but not included in the project. It also has a number of minor inconveniences, although IDE CLion is still far from convenient in working with very specific Qt functionality, at least take the auto-completion of Qt macros, automatically create the missing class members (variables and methods) for these macros, work with the designer, etc. .

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!

BlinCT
  • July 23, 2017, 4:41 a.m.

При том подходе в разработке что ведет JetBrains, скоро CLion обгонит QtCreator. Даже сейчас он в некоторых местах по функционалу уже обходит QtCreator(работа с VCS уже превосходит в удобстве). Так что будем посмотреть)

IscanderChe
  • Nov. 30, 2018, 10:48 a.m.

Спасибо! Очень помогло в освоении CMake.

IscanderChe
  • Dec. 5, 2018, 4:56 a.m.

При компиляции примера Qt Creator выдаёт следующую ошибку:
"Для сборки необходимо, чтобы была задана утилита CMake. Задайте её в настройках комплекта."

При этом комплект настроен как надо (в моём понимании): при наведении курсора на комплект показывается перечень настроек комплекта во всплывающей подсказке. В т.ч. и про CMake: "CMake Системная CMake в %путь_до_cmake.exe%".

Windows 7 Корпоративная Service Pack 1
Qt Creator 4.6.2

Evgenii Legotckoi
  • Dec. 5, 2018, 5:07 a.m.

А что у вас в настройка во вкладке CMake, есть что-нибудь? У меня например по умолчанию ничего нет под Windows.

Хотя при наведении на комплект кое-что есть в тултипе, однако - это переменные в Path, но не сами пути.

IscanderChe
  • Dec. 5, 2018, 5:12 a.m.

А где найти вкладку CMake?

Evgenii Legotckoi
  • Dec. 5, 2018, 5:18 a.m.

Вот здесь



IscanderChe
  • Dec. 5, 2018, 5:27 a.m.

Вот.

Evgenii Legotckoi
  • Dec. 5, 2018, 5:35 a.m.

Ну теоретически он должен быть установлен в комплекте. Покажите информацию о комплекте.

Если CMake Tool пустой, то нужно установить, если нет, то пересборка проекта, шаманство с переменными окружения и т.д. Где-то получается, что не находит адекватно CMake. К сожалению под Qt Creator я проекты на CMake не собирал, только CLion использую для этого.

IscanderChe
  • Dec. 5, 2018, 5:45 a.m.

Вот.


Главное, под linux-версией всё сразу взлетело...

Evgenii Legotckoi
  • Dec. 5, 2018, 5:53 a.m.

Под linux как правило проще, там всё по свои каталогам и полочкам разложено сразу.

Думается мне, что проблема все-таки где-то в путях переменных...

IscanderChe
  • Dec. 5, 2018, 8:21 a.m.

В переменной PATH путь к CMake был указан как G:\soft\CMake\bin, в реальности же каталог называется Cmake.

Причём после изменения в переменной PATH всё заработало, а в Qt Creator путь остался по-прежнему с CMake.

Evgenii Legotckoi
  • Dec. 5, 2018, 8:25 a.m.

Значит всё-таки в переменных окружения была проблема. Полагаю, что Qt Creator берёт информацию сначала из переменных PATH, либо записывает её из  своего конфига, а потом берёт уже из PATH при запуске сборки. По какой-то причине у вас сменилось название каталога, Qt Creator не обнаружил изменения и не изменил переменные окружения. И по прежнему пытался тянуть из несуществующего каталога cmake.

Хорошо, что нашли, где ошибка была.

R
  • Feb. 21, 2019, 4:28 a.m.

Падает с ошибкой -1073741515 (0xC0000135). Не знаете, что можно с этим сделать?

Evgenii Legotckoi
  • Feb. 21, 2019, 4:36 a.m.

Подобное описание ошибки на самом деле совсем ничего не говорит, может быть что угодно. Падает сразу? То есть даже не запустившись? Или всё-таки запускается и при каких-то действиях падает?

Странно, что по запросу 0xC0000135 гугл выдаёт уйму страниц, в которых описываются ситуации с неисправной ОС или HDD.

Возможно, просто что-то неправильно написали или библиотеки не подключились. Либо у вас действительно битый HDD.

R
  • Feb. 21, 2019, 6:54 a.m.

Даже не запускается.

main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы.

cmake_minimum_required(VERSION 3.13)
project(untitled)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
set(SOURCE_FILES main.cpp)
set(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")
set(Qt5Gui_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Gui")
set(Qt5Widgets_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Widgets")

find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Widgets REQUIRED)

add_executable(untitled ${SOURCE_FILES})

target_link_libraries(untitled Qt5::Core)
target_link_libraries(untitled Qt5::Gui)
target_link_libraries(untitled Qt5::Widgets)

Погуглив, я тоже находил ответы, что проблема может быть в том, что не подключаются какие-то библиотеки. Но это довольно странно, т.к. путь к CMake я указал так же, как описывается в статье(-DCMAKE_PREFIX_PATH=/C:/Qt/5.12.1/mingw73_64/lib/cmake).

Кстати, в обычном Qt Creator этот же код отлично работает.

BlinCT
  • Feb. 21, 2019, 7:04 a.m.

Смотрите, если вы используете глобально для проекта -DCMAKE_PREFIX_PATH= то вам не надо уже указывать вот эти строки
set(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")
set(Qt5Gui_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Gui")
set(Qt5Widgets_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Widgets")

потому что вы уже указываете где искать. И он уже за счет find_package(Qt5Core REQUIRED) будет знать что ему за cmake нужен.
Второе, не используйте после создания таргета имя проекта, используйте только ${PROJECT_NAME}. Это так, совет, чтоыб ваш конфиг был читаемый.

BlinCT
  • Feb. 21, 2019, 7:08 a.m.

Вот атк выглядит мой проектник, посмотрите его.

cmake_minimum_required(VERSION 3.6)
project(projecttimer)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt5Widgets REQUIRED)
find_package(Qt5Qml REQUIRED)
find_package(Qt5Quick REQUIRED)
find_package(Qt5QuickWidgets REQUIRED)
find_package(Qt5QuickControls2 REQUIRED)

qt5_add_resources(RCC_RESOURCES qml.qrc translations.qrc audio.qrc image.qrc)

#include_directories(./Sources)

set(SOURCE_FILES
        Sources/circletimer.cpp
        Sources/circletimer.h
        Sources/qmltranslator.cpp
        Sources/qmltranslator.h
        main.cpp
        )

add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${RCC_RESOURCES})

target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Qml Qt5::Quick Qt5::QuickWidgets Qt5::QuickControls2)

И главнео соблюдайте порядок, что вы делаете, обьявляете или создаете. Это важно.

R
  • Feb. 21, 2019, 7:29 a.m.

Я указал данные строки, т.к. без них у меня вылетала следующая ошибка:

By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Qt5Core", but CMake did not find one.
Could not find a package configuration file provided by "Qt5Core" with any
of the following names:

Qt5CoreConfig.cmake

qt5core-config.cmake

Понятия не имею, почему он изначально не видел эти файлы.

Насчёт ${PROJECT_NAME} учту, спасибо.

Evgenii Legotckoi
  • Feb. 21, 2019, 7:51 a.m.

Иногда CMake приходится перезапускать начисто, не обновляет кэш

Comments

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

C++ - Test 002. Constants

  • Result:41points,
  • Rating points-8
E

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

  • Result:80points,
  • Rating points4
E

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

  • Result:53points,
  • Rating points-4
Last comments
Evgenii Legotckoi
Evgenii LegotckoiDec. 3, 2023, 8:39 a.m.
Django - Lesson 059. Saving the selected language in user settings It is redirect from untranslated url to translated url. It is normal behavior for mutlilanguage web site based on the Django.
c
coder55Dec. 1, 2023, 5:34 p.m.
Django - Lesson 059. Saving the selected language in user settings It tries to do language translation in API views. That's why it sends or receives the same API request twice. Do you have any suggestions on this? Example: stripe webhook. "GET /warehouse/…
g
gr1047Nov. 12, 2023, 10:35 a.m.
Qt/C++ - Lesson 035. Downloading files via HTTP with QNetworkAccessManager Добрый день. Изучаю Qt на ваших уроках. Всё нормально работает на Linux. А под Win один раз запустилось, а сейчас вместо данных сайта получается ошибк "Unable to write". Куда копать, ума не…
D
DamirNov. 2, 2023, 3:41 a.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers С CMake всё на много проще: find_package(Boost)
Павел Дорофеев
Павел ДорофеевOct. 28, 2023, 2:48 p.m.
Как написать свой QTableView Итак начинаем писать свои виджеты на основе QAbstractItemView. А что так можно было?
Now discuss on the forum
BlinCT
BlinCTNov. 30, 2023, 9:18 a.m.
Сборка проекта Qt6 из под винды на удаленой машине Всем привет. Сталкнулся с такой странностью: надо собирать проект из под 10 винды на удаленой линуксовой машине, проект строится на QT6, но вот когда cmake генерит свой кеш то вылитает…
Evgenii Legotckoi
Evgenii LegotckoiNov. 19, 2023, 8:14 a.m.
CKEditor 5 и подсветка синтаксиса. Добрый день. Я устал разбираться с CKEditor и просто перешёл на использование самописного markdown редактора...
Виктор Калесников
Виктор КалесниковOct. 20, 2023, 4:29 a.m.
Контакты Android делал в далеком 2017г поэтому особенно ничего не подскажу. Это основные методы получения данных с андроида используя Qt. Там еще какоето колдунство с манифестом. Андроидом давно не занимаюс…
m
mihamuzOct. 18, 2023, 2:03 p.m.
Скачать Qt 6 Сработал следующий алгоритм. Инстолятор скачал используя это https://freevpnplanet.com/ru/ как расширение браузера. Потом установил это https://freevpnplanet.com/ru/ же на ПК и через инстолятор …

Follow us in social networks