FLTK - упрощаем себе жизнь с msys2
BIN
content/posts/fltk-msys2-cmake/app.gif
(Stored with Git LFS)
Normal file
BIN
content/posts/fltk-msys2-cmake/app.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
content/posts/fltk-msys2-cmake/download.png
Normal file
After Width: | Height: | Size: 28 KiB |
160
content/posts/fltk-msys2-cmake/index.md
Normal file
@ -0,0 +1,160 @@
|
||||
---
|
||||
title: "FLTK - упрощаем себе жизнь с msys2"
|
||||
date: 2023-01-03T16:55:31+03:00
|
||||
draft: false
|
||||
categories: ["cpp"]
|
||||
<!-- featured_image: miniature.jpg -->
|
||||
---
|
||||
|
||||
Обновление статейки по созданию [приложений на FLTK](/fltk-apps), так как нынче всё стало проще.
|
||||
|
||||
<!--more-->
|
||||
|
||||
# Часть первая – установка 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 <FL/Fl.H>
|
||||
#include <Fl/Fl_Window.H>
|
||||
#include <Fl/Fl_Box.H>
|
||||
#include <Fl/Fl_Button.H>
|
||||
#include <cstdio>
|
||||
|
||||
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) {
|
||||
// Создаём окно
|
||||
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
|
||||
|
||||
скоро будет
|
BIN
content/posts/fltk-msys2-cmake/install-devtools.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
content/posts/fltk-msys2-cmake/install-msys2.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
content/posts/fltk-msys2-cmake/ldd.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
content/posts/fltk-msys2-cmake/update-phase-1.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
content/posts/fltk-msys2-cmake/update-phase-2.png
Normal file
After Width: | Height: | Size: 39 KiB |