На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> Его величество MSYS2
    Буэнос диас, амигос!

    Тема возникла ну почти внезапно, с подачи нашего форумчанина Rodion...

    Маленькая предыстория

    Я помню свои первые мучительные "изыскания" в 2011 году c Qt5. Тема хорошая, прекрасная - но геморроя просто выше крыши. А тот проект по времени поджимал просто адово! Слава Богам я набрел на проект mxe.cc, проникся, поставил его на виртуальную машину под линуха (ныне это Linux Manjaro) и просто забыл о бедах. Ну ваапще и полностью забыл!

    Однако часто вижу в сети страдальцев "а-ля - не могу собрать драйвер БД в Qt". И после этого меня всегда настигает эмпатия в виде нестерпимой боли! Но сегодня я почти кросава - я напрягся и вспомнил, видел в сети проект MSYS2. Да, это не полная виртуализация, скорее эмуляция. Но там все собирается с пакетов, а-ля арч-линукс! Используя утиль"pacman".

    Плюсики
    1. Виртуализации нет - работаем практически на родном железе - а это скорость
    2. UNIX-way подход к сборкам, unix-утилиты готовы к работе

    Минусики
    1. Виртуализация подразумевает полный функционал. А тут "огрызок", даже утилиты Valgrind не наблюдается
    2. Это не настоящая "unix-среда"? и QtCreator немного в ней тупит.

    Начинаем пользоваться MSYS2

    Сперва выкачиваем дистрибутив со странички https://www.msys2.org и устанавливаем. Особое внимание на предупреждение с того сайта "Enter your desired Installation Folder (short ASCII-only path on a NTFS volume, no accents, no spaces, no symlinks, no subst or network drives, no FAT". Поэтому я выбираю путь установки: E:\Tools\MSys64.

    Все последующие действия проводим с терминале MSYS2, который запускается командой E:\Tools\MSys64\msys2_shell.cmd

    Сперва обновим репозитарий:

    ExpandedWrap disabled
      pacman -Suy

    После этого MSYS2 попросит закрыться. Открываем окно терминала заново и продолжаем установку нужных нам пакетов:

    ExpandedWrap disabled
      pacman -S --noconfirm mc patch colordiff gdb cmake
      pacman -S --noconfirm mingw-w64-x86_64-gcc mingw-w64-x86_64-gdb mingw-w64-x86_64-cmake mingw-w64-x86_64-extra-cmake-modules
      pacman -S --noconfirm mingw-w64-i686-gcc mingw-w64-i686-gdb mingw-w64-i686-cmake mingw-w64-i686-extra-cmake-modules
      pacman -S --noconfirm mingw-w64-x86_64-qt5 mingw-w64-x86_64-qt5-static mingw-w64-x86_64-qt5-doc
      pacman -S --noconfirm mingw-w64-i686-qt5 mingw-w64-i686-qt5-static mingw-w64-i686-qt5-doc
      pacman -S --noconfirm mingw-w64-x86_64-postgresql mingw-w64-i686-postgresql
      pacman -S --noconfirm mingw-w64-x86_64-libmariadbclient mingw-w64-i686-libmariadbclient
      pacman -S --noconfirm mingw-w64-x86_64-make mingw-w64-i686-make
      pacman -S --noconfirm mingw-w64-x86_64-jom mingw-w64-i686-jom


    В результате подставилось следующее:

    1. Midnight Commander
    2. Утилиты patch и diff
    3. Отладчик gdb
    4. Утилита сборки смаке

    А также для двух комплектов туллчейнов x86_64 и i686 поставилось:

    1. Компилятор GCC
    2. Отладчик GDB
    3. Утилита сборки CMAKE с дополнительными модулями
    4. Собранные комплекты Qt 5.15.3 для динамической и статической сборки + документация
    5. Библиотеки для PostgreSQL и MySQL (MariaDB)
    6. Утилита сборки MAKE
    7. Утилита сборки JOM

    Важное замечание: Почему процедура установки представлена не одной командой? Все просто. Достаточно редко, но все же, в процессе установки бывают сбои а-ля "SSL timeout..." при выкачивании файлов. Бывает. Решается это повторным запуском той же команды через 1-2 мин. Однако в этом случае команда переустанавливает весь софт, который уже успела установить. Вот именно для предотвращения этого мы устанавливаем "порциями". Одну команду запустили, проверили, нет ошибок, запускаем следующую. Если ошибка есть, повторяем запуск, пока не получим установку без ошибок.

    Установка QtCreator

    Есть два варианта:

    1. Ставить самый свежий с сайта, на момент написания статьи это 8.0.1
    2. Ставить не свежий прямо в MSYS2, на момент написания статьи это 7.*

    Первый вариант - зе бест! Но, если вы из России или из Беларуси, в процессе установки готовьтесь увидеть сообщение "Your IP not allowed", ну или что-то в этом духе. Вы наверное спросите "как это пониматьвашу?". Ответ простой: санкции. Я нашел простой выход. Прописал в установщике работающий HTTP-proxy из Франции и на санкции был положен уверенный белорусский болт! Установка была произведена успешно.

    Второй вариант - так себе, если не прошел первый. Ставим QtCreator прямо из MSYS2:

    ExpandedWrap disabled
      pacman -Ss qt-creator
      pacman -S --noconfirm mingw-w64-x86_64-qt-creator


    QtCreator поставится, но подтянет за собой кучу "мусора" из Qt6. Запуск его ищем в недрах MSYS2, что-то а ля qtcreator.exe

    Настройка QtCreator

    Желательно и настоятельно ... Не полагаться на авто-найденные установки, а сделать все вручную (сперва все удОлить). Запускаем QtCreator и открываем "Настройки". До 8-й версии QtCreator они находились в меню "Инструменты", а в 8-й версии они "переехали" в меню "Правка". Нас интересует закладка "Комплекты". В этой закладке видим набор свойств в таб-барах:

    • Комплекты
    • Профили Qt
    • Компиляторы
    • Отладчики
    • CMake

    Мы начинаем настройку с конца в начало, с CMаке.

    CMake

    user posted image

    Отладчики

    Тут я ничего не правил - меня это устроило.

    user posted image

    Компиляторы

    Авто-найденные я оставил как есть. Но руками добавил нужные мне:

    user posted image

    Профили Qt

    Заполняем. Для статической сборки с QML небольшие траблы. Кому это важно - постарайтесь развидить эту статью.

    user posted image

    Комплекты

    Тут собираем все, учитывая учтановленные нами туллчейны. Следим за стрелочками. А в красной рамочке - "вишенка" :rolleyes: Это позволит в процессе разработки в окне вывода видеть отладочную информацию о загрузках Qt-плагинов:

    user posted image

    На этом все - рабочая настроенная среда готова. Пора действовать!!!

    Устанавливаем и запускаем сервер БД

    Давайте замутим тест работы с базами данных. Среда разработки есть - баз данных нет. Не проблема, решаем! Заходим на сайт просто прекрасных людей https://ospanel.io, выкачиваем и устанавливаем OpenServer. Настройки последнего я расписывать не буду, но сообщу - они есть! :lol:

    user posted image

    user posted image

    А для создания БД и таблиц пользуемся инструментами:

    user posted image

    Тестовый тест

    В QtCreator создаем проект - файлы его будут ниже. А в OpenServer запускаем PostgreSQL и MySQL, и создаем БД и таблицы. Что создавать - смотрим код проекта.

    HelloDatabases.pro

    ExpandedWrap disabled
      QT += core gui sql
       
      greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
       
      CONFIG += c++17
       
      SOURCES += \
          main.cpp \
          dialog.cpp
       
      HEADERS += \
          dialog.h
       
      qnx: target.path = /tmp/$${TARGET}/bin
      else: unix:!android: target.path = /opt/$${TARGET}/bin
      !isEmpty(target.path): INSTALLS += target


    main.cpp

    ExpandedWrap disabled
      #include "dialog.h"
       
      #include <QApplication>
       
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
          Dialog w;
          w.show();
          return a.exec();
      }


    dialog.h

    ExpandedWrap disabled
      #ifndef DIALOG_H
      #define DIALOG_H
       
      #include <QtWidgets>
      #include <QtSql>
       
      class Dialog : public QDialog
      {
          Q_OBJECT
       
          QTableView *Pt,*Pm;
          QSqlQueryModel *Mp, *Mm;
          QPushButton *BtnP, *BtnM, *BtnClose;
          QSqlDatabase DbPgSql,DbMySql;
       
        public:
       
          Dialog(QWidget *parent = nullptr);
          ~Dialog() {};
       
        public slots:
       
          void SlotPgSQL();
          void SlotMySQL();
      };
       
      #endif // DIALOG_H


    dialog.cpp

    ExpandedWrap disabled
      #include "dialog.h"
       
      Dialog::Dialog(QWidget *parent)
          : QDialog(parent)
      {
          QGridLayout *L = new QGridLayout;
          QLabel *L1 = new QLabel("PostreSQL:");
          QLabel *L2 = new QLabel("MySQL:");
          Pt = new QTableView;
          Pm = new QTableView;
          BtnP = new QPushButton("Прочесть");
          BtnM = new QPushButton("Прочесть");
          BtnClose = new QPushButton("Close");
          L->addWidget(L1,0,0,1,2);
          L->addWidget(BtnP,0,2,1,2,Qt::AlignRight);
          L->addWidget(Pt,1,0,1,4);
          L->addWidget(L2,2,0,1,2);
          L->addWidget(BtnM,2,2,1,2,Qt::AlignRight);
          L->addWidget(Pm,3,0,1,4);
          L->addWidget(BtnClose,4,3,1,1);
          setLayout(L);
          setMinimumSize(640,480);
          resize(0,0);
          connect(BtnP, &QPushButton::clicked, this, &Dialog::SlotPgSQL);
          connect(BtnM, &QPushButton::clicked, this, &Dialog::SlotMySQL);
          connect(BtnClose, &QPushButton::clicked,this, [&](){close();});
      }
       
      void Dialog::SlotPgSQL()
      {
          if (!DbPgSql.isOpen()) {
            DbPgSql = QSqlDatabase::addDatabase("QPSQL","First");
            DbPgSql.setHostName("127.0.0.1");
            DbPgSql.setDatabaseName("postgres");
            DbPgSql.setUserName("postgres");
            DbPgSql.setPassword("");
            if (!DbPgSql.open()) {
              QMessageBox::warning(this,"Oops!","С базой PostgreSQL пошло штото нетак!");
              return;
            }
          }
          Mp = new QSqlQueryModel(this);
          QSqlQuery Q("SELECT * FROM pg_example",DbPgSql);
          Mp->setQuery(Q);
          Pt->setModel(Mp);
      }
       
      void Dialog::SlotMySQL()
      {
          if (!DbMySql.isOpen()) {
            DbMySql = QSqlDatabase::addDatabase("QMYSQL","Second");
            DbMySql.setHostName("127.0.0.1");
            DbMySql.setDatabaseName("my_example");
            DbMySql.setUserName("root");
            DbMySql.setPassword("root");
            if (!DbMySql.open()) {
              QMessageBox::warning(this,"Oops!","С базой MySQL пошло штото нетак!");
              return;
            }
          }
          Mm = new QSqlQueryModel(this);
          QSqlQuery Q("SELECT * FROM my_table",DbMySql);
          Mm->setQuery(Q);
          Pm->setModel(Mm);
      }


    После сборки запускаем и кликаем на кнопки и видим загрузку данных с разных БД - PostgreSQL и MySQl баз:

    user posted image

    Подбиваем итоги

    1. Относительно несложными "движениями" мы создали для себя достаточно хорошую (Linux Manjaro + MXE значительно лучше) среду разработки, базирующуюся на Qt5
    2. Небольшая ложечка пакастей :lol: А при статической линковке работа с БД вызывает проблемсы... А вот это для вас - домашнее задание!

    Надеюсь, что был полезен. Вспоминая меня добрым словом, вы реально прогрузите мою энергию ЦЫ, столь необходимую для моего обмена веществ!
    :victory: Peace!!!
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0267 ]   [ 15 queries used ]   [ Generated: 26.04.24, 13:36 GMT ]