Evgenii Legotckoi
23 июля 2017 г. 14: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.  Полный путь к библиотекам может быть следующим:

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

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

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

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

CMakeLists.txt

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

  1. cmake_minimum_required(VERSION 3.8)
  2. project(HelloWorld)
  3.  
  4. set(CMAKE_CXX_STANDARD 17)
  5.  
  6. # включаем поиск библиотек с использованием find_package()
  7. # через REQUIRED указываем, что библиотеки обязательны
  8. find_package(Qt5Core REQUIRED)
  9. find_package(Qt5Gui REQUIRED)
  10. find_package(Qt5Widgets REQUIRED)
  11.  
  12. set(SOURCE_FILES main.cpp)
  13. add_executable(HelloWorld ${SOURCE_FILES})
  14.  
  15. # указываем, какие библиотеки необходимо подключить
  16. target_link_libraries(${PROJECT_NAME} Qt5::Core)
  17. target_link_libraries(${PROJECT_NAME} Qt5::Gui)
  18. target_link_libraries(${PROJECT_NAME} Qt5::Widgets)

main.cpp

В остальном же написание первого HelloWorld будет сходным  разработкой под Qt Creator.

  1. #include <QtWidgets/QApplication>
  2. #include <QtWidgets/QWidget>
  3. #include <QtWidgets/QGridLayout>
  4. #include <QtWidgets/QLabel>
  5.  
  6. int main(int argc, char *argv[]) {
  7.  
  8. QApplication app(argc, argv);
  9.  
  10. QWidget widget;
  11. widget.resize(640, 480);
  12. widget.setWindowTitle("Hello, world!!!");
  13.  
  14. QGridLayout *gridLayout = new QGridLayout(&widget);
  15.  
  16. QLabel * label = new QLabel("Hello, world!!!");
  17. label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
  18. gridLayout->addWidget(label);
  19.  
  20. widget.show();
  21.  
  22. return app.exec();
  23. }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вот здесь



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

Вот.

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

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

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

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

Вот.


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. cmake_minimum_required(VERSION 3.13)
  2. project(untitled)
  3.  
  4. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
  5. set(SOURCE_FILES main.cpp)
  6. set(Qt5Core_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Core")
  7. set(Qt5Gui_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Gui")
  8. set(Qt5Widgets_DIR "C:/Qt/5.12.1/mingw73_64/lib/cmake/Qt5Widgets")
  9.  
  10. find_package(Qt5Core REQUIRED)
  11. find_package(Qt5Gui REQUIRED)
  12. find_package(Qt5Widgets REQUIRED)
  13.  
  14. add_executable(untitled ${SOURCE_FILES})
  15.  
  16. target_link_libraries(untitled Qt5::Core)
  17. target_link_libraries(untitled Qt5::Gui)
  18. target_link_libraries(untitled Qt5::Widgets)

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

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

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

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

  1. cmake_minimum_required(VERSION 3.6)
  2. project(projecttimer)
  3.  
  4. set(CMAKE_CXX_STANDARD 11)
  5. set(CMAKE_AUTOMOC ON)
  6. set(CMAKE_AUTORCC ON)
  7.  
  8. find_package(Qt5Widgets REQUIRED)
  9. find_package(Qt5Qml REQUIRED)
  10. find_package(Qt5Quick REQUIRED)
  11. find_package(Qt5QuickWidgets REQUIRED)
  12. find_package(Qt5QuickControls2 REQUIRED)
  13.  
  14. qt5_add_resources(RCC_RESOURCES qml.qrc translations.qrc audio.qrc image.qrc)
  15.  
  16. #include_directories(./Sources)
  17.  
  18. set(SOURCE_FILES
  19. Sources/circletimer.cpp
  20. Sources/circletimer.h
  21. Sources/qmltranslator.cpp
  22. Sources/qmltranslator.h
  23. main.cpp
  24. )
  25.  
  26. add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${RCC_RESOURCES})
  27.  
  28. target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Qml Qt5::Quick Qt5::QuickWidgets Qt5::QuickControls2)

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

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

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

Комментарии

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