Evgenii Legotckoi
Evgenii Legotckoi23 июля 2017 г. 3: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 г. 3:41

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

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

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

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

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

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

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

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

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

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

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

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

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

Вот здесь



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

Вот.

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

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

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

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

Вот.


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии

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

C++ - Тест 003. Условия и циклы

  • Результат:21баллов,
  • Очки рейтинга-10
АФ

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

  • Результат:30баллов,
  • Очки рейтинга-10
ПЩ

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

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
k
kmssr9 февраля 2024 г. 5:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 12:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 21:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 19:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 декабря 2023 г. 8:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
P
Pisych27 февраля 2023 г. 15:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
Alexandru Codreanu19 января 2024 г. 22:57
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
BlinCT
BlinCT27 декабря 2023 г. 19:57
Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
Дмитрий
Дмитрий10 января 2024 г. 15:18
Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
Evgenii Legotckoi
Evgenii Legotckoi12 декабря 2023 г. 17:48
Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

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