mmote.ru/content/posts/fltk-msys2/index.md

170 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "FLTK - упрощаем себе жизнь с msys2 (часть 1)"
date: 2023-01-03T16:55:31+03:00
lastmod: 2023-01-17T21:29:23+03:00
draft: false
categories: ["cpp"]
featured_image: thumb.png
---
Обновление статейки по созданию [приложений на FLTK](/fltk-apps), так как нынче установка
библиотек и компилятора стала проще.
<!--more-->
Содержание:
{{< toc >}}
## Часть первая установка msys2
Начнём. Скачиваем установщик msys2 с [официального сайта](https://www.msys2.org):
![download](download.png)
Устанавливаем. Я оставил все параметры по-умолчанию:
![install-msys2](install-msys2.png)
Запускаем MSYS2 MINGW32:
![msys2-mingw32](msys2-mingw32.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 <cstdio>
#include <FL/Fl.H>
#include <Fl/Fl_Window.H>
#include <Fl/Fl_Box.H>
#include <Fl/Fl_Button.H>
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<MainWindow *>(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) {
// Задаём тему для виджетов (none, base, plastic, gtk+, gleam)
// Fl::scheme("gleam");
// Создаём окно
MainWindow *window = new MainWindow(200, 300, "i++");
// Показываем окно
window->show();
// Запускаем event loop
return Fl::run();
}
```
### Сборка напрямую
Для начала пробуем всё собрать напрямую компилятором, без систем сборки. Мой проект находится в D:/code. Поэтому нужно перейти в этот каталог.
```bash
cd /d/code
```
Пробуем собрать наше приложение. Меня в первую очередь интересовала статическая сборка, когда все зависимости интегрируются в один исполняемый файл.
```bash
g++ main.cpp -o main.exe -O2 -DWIN32 -static -lfltk -lole32 -luuid -lcomctl32 -mwindows
```
**-DWIN32** указываем FLTK, что мы под Windows.
**-mwindows** убираем чёрное окно команд у приложения и подключаем некоторые системные библиотеки.
**-static** статическая сборка.
**-lfltk -lole32 -luuid -lcomctl32** подключение необходимых библиотек.
Никакого вывода команда не выдаёт.
Проверяем, что наше приложение не требует никаких дополнительных библиотек с помощью [Dependencies](https://github.com/lucasg/Dependencies).
Ничего кроме системных путей тут быть не должно:
![depends](depends.png)
После этого можно запускать приложение.
![app](app.gif)
### Сборка через CMake
[FLTK - собираем приложения с msys2 и CMake (часть 2)](/fltk-msys2-cmake)