Напишем "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, автоматическое создание недостающих участников класса (переменные и методы) по этим макросам, работу с дизайнером и т.д.
При том подходе в разработке что ведет JetBrains, скоро CLion обгонит QtCreator. Даже сейчас он в некоторых местах по функционалу уже обходит QtCreator(работа с VCS уже превосходит в удобстве). Так что будем посмотреть)
Спасибо! Очень помогло в освоении CMake.
При компиляции примера Qt Creator выдаёт следующую ошибку:
"Для сборки необходимо, чтобы была задана утилита CMake. Задайте её в настройках комплекта."
При этом комплект настроен как надо (в моём понимании): при наведении курсора на комплект показывается перечень настроек комплекта во всплывающей подсказке. В т.ч. и про CMake: "CMake Системная CMake в %путь_до_cmake.exe%".
Windows 7 Корпоративная Service Pack 1
Qt Creator 4.6.2
А что у вас в настройка во вкладке CMake, есть что-нибудь? У меня например по умолчанию ничего нет под Windows.
Хотя при наведении на комплект кое-что есть в тултипе, однако - это переменные в Path, но не сами пути.
А где найти вкладку CMake?
Вот здесь
Вот.
Ну теоретически он должен быть установлен в комплекте. Покажите информацию о комплекте.
Если CMake Tool пустой, то нужно установить, если нет, то пересборка проекта, шаманство с переменными окружения и т.д. Где-то получается, что не находит адекватно CMake. К сожалению под Qt Creator я проекты на CMake не собирал, только CLion использую для этого.
Вот.
Главное, под linux-версией всё сразу взлетело...
Под linux как правило проще, там всё по свои каталогам и полочкам разложено сразу.
Думается мне, что проблема все-таки где-то в путях переменных...
В переменной PATH путь к CMake был указан как G:\soft\CMake\bin, в реальности же каталог называется Cmake.
Причём после изменения в переменной PATH всё заработало, а в Qt Creator путь остался по-прежнему с CMake.
Значит всё-таки в переменных окружения была проблема. Полагаю, что Qt Creator берёт информацию сначала из переменных PATH, либо записывает её из своего конфига, а потом берёт уже из PATH при запуске сборки. По какой-то причине у вас сменилось название каталога, Qt Creator не обнаружил изменения и не изменил переменные окружения. И по прежнему пытался тянуть из несуществующего каталога cmake.
Хорошо, что нашли, где ошибка была.
Падает с ошибкой -1073741515 (0xC0000135). Не знаете, что можно с этим сделать?
Подобное описание ошибки на самом деле совсем ничего не говорит, может быть что угодно. Падает сразу? То есть даже не запустившись? Или всё-таки запускается и при каких-то действиях падает?
Странно, что по запросу 0xC0000135 гугл выдаёт уйму страниц, в которых описываются ситуации с неисправной ОС или HDD.
Возможно, просто что-то неправильно написали или библиотеки не подключились. Либо у вас действительно битый HDD.
Даже не запускается.
main.cpp у меня точно такой же, как в статье. CMakeLists.txt пришлось немного подправить (прикрепил ниже), т.к. не находились некоторые файлы.
Погуглив, я тоже находил ответы, что проблема может быть в том, что не подключаются какие-то библиотеки. Но это довольно странно, т.к. путь к CMake я указал так же, как описывается в статье(-DCMAKE_PREFIX_PATH=/C:/Qt/5.12.1/mingw73_64/lib/cmake).
Кстати, в обычном Qt Creator этот же код отлично работает.
Смотрите, если вы используете глобально для проекта -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}. Это так, совет, чтоыб ваш конфиг был читаемый.
Вот атк выглядит мой проектник, посмотрите его.
И главнео соблюдайте порядок, что вы делаете, обьявляете или создаете. Это важно.
Я указал данные строки, т.к. без них у меня вылетала следующая ошибка:
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} учту, спасибо.
Иногда CMake приходится перезапускать начисто, не обновляет кэш