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

5.8 KiB
Raw Blame History

title date draft categories featured_image
FLTK - упрощаем себе жизнь с msys2 2023-01-03T16:55:31+03:00 false
cpp
thumb.png

Обновление статейки по созданию приложений на FLTK, так как нынче всё стало проще.

Часть первая установка msys2

Начнём. Скачиваем установщик msys2 с официального сайта:

download

Устанавливаем. Я оставил все параметры по-умолчанию:

install-msys2

Вводим команду для обновления всех пакетов:

pacman -Syu

Соглашаемся со всем. В конце msys2 попросит перезапустить себя:

update-phase-1

Снова выполяем

pacman -Syu

и обновляем оставшуюся часть пакетов:

update-phase-2

Готово! msys2 и его компоненты теперь последней версии и готовы к работе.

Часть вторая установка инструментария разработчика

Осталось установить компилятор, базовые инструменты для компиляции, cmake, fltk.

Мне кажется, если вы выбрали fltk, то вас интересует поддержка старых машин. Поэтому устанавливаем 32-битные версии компилятора и библиотек. Если вас интересует платформа x64, то вместо i686 в названиях пакетов используйте x86_64 (например, mingw-w64-x86_64-fltk).

Выполняем

pacman -S base-devel mingw-w64-i686-gcc mingw-w64-i686-cmake mingw-w64-i686-fltk

install-devtools

Часть третья - пишем и собираем приложения

Код

В этот раз будет программа, считающая нажатия на кнопку.

#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. Поэтому нужно перейти в этот каталог.

cd /d/code

Пробуем собрать наше приложение. Меня в первую очередь интересовала статическая сборка, когда все зависимости интегрируются в один исполняемый файл.

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 подключение необходимых библиотек.

Никакого вывода команда не выдаёт. Проверяем, что наше приложение не требует никаких дополнительных библиотек.

ldd main.exe

Ничего кроме системных путей тут быть не должно:

ldd

После этого можно запускать приложение.

app

Сборка через cmake

скоро будет