diff --git a/content/posts/fltk-msys2-cmake/app.gif b/content/posts/fltk-msys2-cmake/app.gif new file mode 100644 index 0000000..ae1a074 --- /dev/null +++ b/content/posts/fltk-msys2-cmake/app.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23c9477706d14e45610e0e7f4a9e9df5be433c9d004a6e0623d4ecf495419f6a +size 74762 diff --git a/content/posts/fltk-msys2-cmake/app.png b/content/posts/fltk-msys2-cmake/app.png new file mode 100644 index 0000000..5f4b919 Binary files /dev/null and b/content/posts/fltk-msys2-cmake/app.png differ diff --git a/content/posts/fltk-msys2-cmake/download.png b/content/posts/fltk-msys2-cmake/download.png new file mode 100644 index 0000000..330b842 Binary files /dev/null and b/content/posts/fltk-msys2-cmake/download.png differ diff --git a/content/posts/fltk-msys2-cmake/index.md b/content/posts/fltk-msys2-cmake/index.md new file mode 100644 index 0000000..76b9bf7 --- /dev/null +++ b/content/posts/fltk-msys2-cmake/index.md @@ -0,0 +1,160 @@ +--- +title: "FLTK - упрощаем себе жизнь с msys2" +date: 2023-01-03T16:55:31+03:00 +draft: false +categories: ["cpp"] + +--- + +Обновление статейки по созданию [приложений на FLTK](/fltk-apps), так как нынче всё стало проще. + + + +# Часть первая – установка msys2 + +Начнём. Скачиваем установщик msys2 с [официального сайта](https://www.msys2.org): + +![download](download.png) + +Устанавливаем. Я оставил все параметры по-умолчанию: + +![install-msys2](install-msys2.png) + + +Вводим команду для обновления всех пакетов: + +```bash +pacman -Syu +``` + +Соглашаемся со всем. В конце msys2 попросит перезапустить себя: + +![update-phase-1](update-phase-1.png) + +Снова выполяем + +```bash +pacman -Syu +``` + +и обновляем оставшуюся часть пакетов: + +![update-phase-2](update-phase-2.png) + +Готово! msys2 и его компоненты теперь последней версии и готовы к работе. + +# Часть вторая – установка инструментария разработчика + +Осталось установить компилятор, базовые инструменты для компиляции, cmake, fltk. + +Мне кажется, если вы выбрали fltk, то вас интересует поддержка старых машин. Поэтому устанавливаем 32-битные версии компилятора и библиотек. Если вас интересует платформа x64, то вместо **i686** в названиях пакетов используйте **x86_64** (например, mingw-w64-**x86_64**-fltk). + +Выполняем + +```bash +pacman -S base-devel mingw-w64-i686-gcc mingw-w64-i686-cmake mingw-w64-i686-fltk +``` + +![install-devtools](install-devtools.png) + +# Часть третья - пишем и собираем приложения + +## Код + +В этот раз будет программа, считающая нажатия на кнопку. + +```cpp +#include +#include +#include +#include +#include + +class MainWindow : public Fl_Window { +public: + MainWindow(int w, int h, char const *title) : Fl_Window(w, h, title), m_counter(0) { + // Создаём кнопку + m_button = new Fl_Button(34, 34, 133, 56, "i++"); + // Присваиваем обработчик кнопки, при этом пробрасываем текущее окно + m_button->callback(button_click, this); + // Создаём надпись-счётчик + m_label = new Fl_Box(34, 177, 133, 56); + // Выставляем размер шрифта + m_label->labelsize(50); + // Сразу обновляем текст счётчика + update_label(); + // Заканчиваем добавлять виджеты + end(); + } + +protected: + void update_label() { + // Преобразуем число в строку + std::snprintf(m_label_text, sizeof(m_label_text), "%d", m_counter); + m_label->label(m_label_text); + } + + static void button_click(Fl_Widget *w, void *data) { + // Получаем окно, которое передали обработчику + MainWindow *mw = static_cast(data); + // Увеличиваем счётчик + mw->m_counter++; + // Обновляем надпись + mw->update_label(); + } +private: + Fl_Box *m_label; + Fl_Button *m_button; + char m_label_text[16]; + int m_counter; +}; + +int main(void) { + // Создаём окно + MainWindow *window = new MainWindow(200, 300, "i++"); + // Показываем окно + window->show(); + return Fl::run(); +} +``` + +## Сборка напрямую + +Для начала пробуем всё собрать напрямую компилятором, без систем сборки. Мой проект находится в D:/code. Поэтому нужно перейти в этот каталог. + +```bash +cd /d/code +``` + +Пробуем собрать наше приложение. Меня в первую очередь интересовала статическая сборка, когда все зависимости интегрируются в один исполняемый файл. + +```bash +g++ main.cpp -o main.exe -O2 -DWIN32 -static -static-libgcc -static-libstdc++ -lfltk -lole32 -luuid -lcomctl32 -mwindows +``` + +**-DWIN32** – указываем FLTK, что мы под Windows. + +**-mwindows** – убираем чёрное окошко у приложения и подключаем некоторые системные библиотеки. + +**-static -static-libgcc -static-libstdc++** – статическая сборка, включить системные библиотеки в статическую сборку. + +**-lfltk -lole32 -luuid -lcomctl32** – подключение необходимых библиотек. + +Никакого вывода команда не выдаёт. +Проверяем, что наше приложение не требует никаких дополнительных библиотек. + +```bash +ldd main.exe +``` + +Ничего кроме системных путей тут быть не должно: + +![ldd](ldd.png) + +После этого можно запускать приложение. + +![app](app.gif) + +## Сборка через cmake + +скоро будет diff --git a/content/posts/fltk-msys2-cmake/install-devtools.png b/content/posts/fltk-msys2-cmake/install-devtools.png new file mode 100644 index 0000000..a16496e Binary files /dev/null and b/content/posts/fltk-msys2-cmake/install-devtools.png differ diff --git a/content/posts/fltk-msys2-cmake/install-msys2.png b/content/posts/fltk-msys2-cmake/install-msys2.png new file mode 100644 index 0000000..658ba40 Binary files /dev/null and b/content/posts/fltk-msys2-cmake/install-msys2.png differ diff --git a/content/posts/fltk-msys2-cmake/ldd.png b/content/posts/fltk-msys2-cmake/ldd.png new file mode 100644 index 0000000..c71f010 Binary files /dev/null and b/content/posts/fltk-msys2-cmake/ldd.png differ diff --git a/content/posts/fltk-msys2-cmake/update-phase-1.png b/content/posts/fltk-msys2-cmake/update-phase-1.png new file mode 100644 index 0000000..8c2e03d Binary files /dev/null and b/content/posts/fltk-msys2-cmake/update-phase-1.png differ diff --git a/content/posts/fltk-msys2-cmake/update-phase-2.png b/content/posts/fltk-msys2-cmake/update-phase-2.png new file mode 100644 index 0000000..02060dc Binary files /dev/null and b/content/posts/fltk-msys2-cmake/update-phase-2.png differ