Evgenii Legotckoi
Evgenii Legotckoi23 июля 2017 г. 4:05

Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion

Напишем "Hello, World!!!" на Qt в IDE CLion с использованием системы сборки CMAKE . Акцент на то, что проект разрабатывается в IDE CLion был сделан потому, что для работы с проектом необходимо сделать небольшую настройку для работы с CMAKE .

В результате получим следующее приложение:


Настройка IDE CLion

После того, как Вы создатите проект, необходимо его настроить для работы с библиотекой Qt необходимо настроить путь к этой библиотеке через аргумент CMAKE_PREFIX_PATH.

Для этого перейдите в настройки IDE. File -> Settings -> Build, Execution, Deployment -> CMake

Далее в CMake Options через CMAKE_PREFIX_PATH указываем путь к библиотекам Qt для CMAKE.  Полный путь к библиотекам может быть следующим:

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

Вся запись префикса будет следующей:

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

В настройках же это окно будет выглядеть следующим образом.

CMakeLists.txt

В CMakeLists.txt кроме информации добавленной по умолчанию необходимо будет добавить поиск и подключение библиотек Qt через использование функций find_package и target_link_libraries.

cmake_minimum_required(VERSION 3.8)
project(HelloWorld)

set(CMAKE_CXX_STANDARD 17)

# включаем поиск библиотек с использованием find_package()
# через REQUIRED указываем, что библиотеки обязательны
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Widgets REQUIRED)

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

# указываем, какие библиотеки необходимо подключить
target_link_libraries(${PROJECT_NAME} Qt5::Core)
target_link_libraries(${PROJECT_NAME} Qt5::Gui)
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)

main.cpp

В остальном же написание первого HelloWorld будет сходным  разработкой под 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();
}

При разработке под Qt Creator с использованием системы сборки CMake не понравилось то, что при добавлении файлов в проект Qt Creator не прописывает их в CMakeLists.txt, то есть файлы создаются, но не включаются в проект. Также имеет ещё ряд небольших неудобств, хотя IDE CLion ещё далеко по удобству в работе с очень специфическим функционалом Qt, хотя бы взять автодополнение макросов Qt, автоматическое создание недостающих участников класса (переменные и методы) по этим макросам, работу с дизайнером и т.д.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

BlinCT
  • 23 июля 2017 г. 4:41

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

IscanderChe
  • 30 ноября 2018 г. 10:48

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

IscanderChe
  • 5 декабря 2018 г. 4:56

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

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

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

Evgenii Legotckoi
  • 5 декабря 2018 г. 5:07

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

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

IscanderChe
  • 5 декабря 2018 г. 5:12

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

Evgenii Legotckoi
  • 5 декабря 2018 г. 5:18

Вот здесь



IscanderChe
  • 5 декабря 2018 г. 5:27

Вот.

Evgenii Legotckoi
  • 5 декабря 2018 г. 5:35

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

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

IscanderChe
  • 5 декабря 2018 г. 5:45

Вот.


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

Evgenii Legotckoi
  • 5 декабря 2018 г. 5:53

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

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

IscanderChe
  • 5 декабря 2018 г. 8:21

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

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

Evgenii Legotckoi
  • 5 декабря 2018 г. 8:25

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

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

R
  • 21 февраля 2019 г. 4:28

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

Evgenii Legotckoi
  • 21 февраля 2019 г. 4:36

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

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

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

R
  • 21 февраля 2019 г. 6:54

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

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
  • 21 февраля 2019 г. 7:04

Смотрите, если вы используете глобально для проекта -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
  • 21 февраля 2019 г. 7:08

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

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
  • 21 февраля 2019 г. 7:29

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

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
  • 21 февраля 2019 г. 7:51

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 22:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi1 ноября 2024 г. 0:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 18:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 17:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 21:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
m
moogo22 ноября 2024 г. 18:17
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii Legotckoi25 июня 2024 г. 1:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

Следите за нами в социальных сетях