diff --git a/content/categories/cpp/_index.md b/content/categories/cpp/_index.md index 6e7c26e..6a29aed 100644 --- a/content/categories/cpp/_index.md +++ b/content/categories/cpp/_index.md @@ -1,3 +1,3 @@ --- -title: "Программирование на C/C++" +title: "Разработка на C/C++" --- \ No newline at end of file diff --git a/content/posts/fltk-apps/index.md b/content/posts/fltk-apps/index.md index a224265..a5a0f31 100644 --- a/content/posts/fltk-apps/index.md +++ b/content/posts/fltk-apps/index.md @@ -15,7 +15,7 @@ featured_image: miniature.jpg > Сейчас всё можно сделать проще! > -> Обновлённая статья - [FLTK - упрощаем себе жизнь с msys2](/fltk-msys2-cmake). +> Обновлённая статья - [FLTK - упрощаем себе жизнь с msys2](/fltk-msys2). Библиотека распространяется в виде исходного кода и скачивается с сайта [fltk.org](http://www.fltk.org/software.php"). Значит, сейчас будем её собирать. diff --git a/content/posts/fltk-msys2-cmake/index.md b/content/posts/fltk-msys2-cmake/index.md index 9982312..4ff0ee7 100644 --- a/content/posts/fltk-msys2-cmake/index.md +++ b/content/posts/fltk-msys2-cmake/index.md @@ -1,175 +1,21 @@ --- -title: "FLTK - упрощаем себе жизнь с msys2" -date: 2023-01-03T16:55:31+03:00 +title: "FLTK - упрощаем себе жизнь с msys2 (часть 2)" +date: 2023-01-07T19:46:00+03:00 draft: false categories: ["cpp"] featured_image: thumb.png --- -Обновление статейки по созданию [приложений на FLTK](/fltk-apps), так как нынче установка -библиотек и компилятора стала проще. +Собираем приложения на FLTK с помощью msys2 и [CMake](https://cmake.org)! -Содержание: +Предыдущая часть с установкой всего необходимого находится [тут](/fltk-msys2). -{{< toc >}} +## Вариант 1 - собираем приложение внутри msys2 -## Часть первая – установка 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) { - // Задаём тему для виджетов (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** – подключение необходимых библиотек. - -Никакого вывода команда не выдаёт. -Проверяем, что наше приложение не требует никаких дополнительных библиотек. - -```bash -ldd main.exe -``` - -Ничего кроме системных путей тут быть не должно: - -![ldd](ldd.png) - -После этого можно запускать приложение. - -![app](app.gif) - -### Сборка через CMake - -#### Вариант 1 - внутри msys2 - -Для cmake хорошим тоном является создавать директорию сборки вне директории проекта. Поэтому немного изменим структуру нашего проекта: +Для CMake хорошим тоном является расположение директорию сборки вне директории проекта. +Поэтому немного изменим структуру нашего проекта: ``` D:\code @@ -252,7 +98,7 @@ ldd /d/code/build/fltk-app.exe ![cmake-msys-ldd](cmake-msys-ldd.png) -#### Вариант 2 - вне msys2 +## Вариант 2 - собираем приложение вне msys2 Сборка через msys2 удобна тогда, когда у нас уже есть готовый проект. Однако когда речь идёт о разработке, то мало какая IDE позволит себе роскошь запускать сборку в окружении msys2. diff --git a/content/posts/fltk-msys2-cmake/app.gif b/content/posts/fltk-msys2/app.gif similarity index 100% rename from content/posts/fltk-msys2-cmake/app.gif rename to content/posts/fltk-msys2/app.gif diff --git a/content/posts/fltk-msys2-cmake/app.png b/content/posts/fltk-msys2/app.png similarity index 100% rename from content/posts/fltk-msys2-cmake/app.png rename to content/posts/fltk-msys2/app.png diff --git a/content/posts/fltk-msys2-cmake/download.png b/content/posts/fltk-msys2/download.png similarity index 100% rename from content/posts/fltk-msys2-cmake/download.png rename to content/posts/fltk-msys2/download.png diff --git a/content/posts/fltk-msys2/index.md b/content/posts/fltk-msys2/index.md new file mode 100644 index 0000000..0f6ccb3 --- /dev/null +++ b/content/posts/fltk-msys2/index.md @@ -0,0 +1,170 @@ +--- +title: "FLTK - упрощаем себе жизнь с msys2 (часть 1)" +date: 2023-01-03T16:55:31+03:00 +draft: false +categories: ["cpp"] +featured_image: thumb.png +--- + +Обновление статейки по созданию [приложений на FLTK](/fltk-apps), так как нынче установка +библиотек и компилятора стала проще. + + + +Содержание: + +{{< toc >}} + +## Часть первая – установка 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) { + // Задаём тему для виджетов (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** – подключение необходимых библиотек. + +Никакого вывода команда не выдаёт. +Проверяем, что наше приложение не требует никаких дополнительных библиотек. + +```bash +ldd main.exe +``` + +Ничего кроме системных путей тут быть не должно: + +![ldd](ldd.png) + +После этого можно запускать приложение. + +![app](app.gif) + +### Сборка через CMake + +[FLTK - собираем приложения с msys2 и CMake (часть 2)](/fltk-msys2-cmake) \ No newline at end of file diff --git a/content/posts/fltk-msys2-cmake/install-devtools.png b/content/posts/fltk-msys2/install-devtools.png similarity index 100% rename from content/posts/fltk-msys2-cmake/install-devtools.png rename to content/posts/fltk-msys2/install-devtools.png diff --git a/content/posts/fltk-msys2-cmake/install-msys2.png b/content/posts/fltk-msys2/install-msys2.png similarity index 100% rename from content/posts/fltk-msys2-cmake/install-msys2.png rename to content/posts/fltk-msys2/install-msys2.png diff --git a/content/posts/fltk-msys2-cmake/ldd.png b/content/posts/fltk-msys2/ldd.png similarity index 100% rename from content/posts/fltk-msys2-cmake/ldd.png rename to content/posts/fltk-msys2/ldd.png diff --git a/content/posts/fltk-msys2/thumb.png b/content/posts/fltk-msys2/thumb.png new file mode 100644 index 0000000..40be031 Binary files /dev/null and b/content/posts/fltk-msys2/thumb.png differ diff --git a/content/posts/fltk-msys2-cmake/update-phase-1.png b/content/posts/fltk-msys2/update-phase-1.png similarity index 100% rename from content/posts/fltk-msys2-cmake/update-phase-1.png rename to content/posts/fltk-msys2/update-phase-1.png diff --git a/content/posts/fltk-msys2-cmake/update-phase-2.png b/content/posts/fltk-msys2/update-phase-2.png similarity index 100% rename from content/posts/fltk-msys2-cmake/update-phase-2.png rename to content/posts/fltk-msys2/update-phase-2.png