Разделение статьи

This commit is contained in:
MultiMote 2023-01-07 20:13:30 +03:00
parent 0c78c130ce
commit de96c8a244
13 changed files with 180 additions and 164 deletions

View File

@ -1,3 +1,3 @@
--- ---
title: "Программирование на C/C++" title: "Разработка на C/C++"
--- ---

View File

@ -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"). Значит, сейчас будем её собирать. Библиотека распространяется в виде исходного кода и скачивается с сайта [fltk.org](http://www.fltk.org/software.php"). Значит, сейчас будем её собирать.

View File

@ -1,175 +1,21 @@
--- ---
title: "FLTK - упрощаем себе жизнь с msys2" title: "FLTK - упрощаем себе жизнь с msys2 (часть 2)"
date: 2023-01-03T16:55:31+03:00 date: 2023-01-07T19:46:00+03:00
draft: false draft: false
categories: ["cpp"] categories: ["cpp"]
featured_image: thumb.png featured_image: thumb.png
--- ---
Обновление статейки по созданию [приложений на FLTK](/fltk-apps), так как нынче установка Собираем приложения на FLTK с помощью msys2 и [CMake](https://cmake.org)!
библиотек и компилятора стала проще.
<!--more--> <!--more-->
Содержание: Предыдущая часть с установкой всего необходимого находится [тут](/fltk-msys2).
{{< toc >}} ## Вариант 1 - собираем приложение внутри msys2
## Часть первая установка msys2 Для CMake хорошим тоном является расположение директорию сборки вне директории проекта.
Поэтому немного изменим структуру нашего проекта:
Начнём. Скачиваем установщик 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 <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** подключение необходимых библиотек.
Никакого вывода команда не выдаёт.
Проверяем, что наше приложение не требует никаких дополнительных библиотек.
```bash
ldd main.exe
```
Ничего кроме системных путей тут быть не должно:
![ldd](ldd.png)
После этого можно запускать приложение.
![app](app.gif)
### Сборка через CMake
#### Вариант 1 - внутри msys2
Для cmake хорошим тоном является создавать директорию сборки вне директории проекта. Поэтому немного изменим структуру нашего проекта:
``` ```
D:\code D:\code
@ -252,7 +98,7 @@ ldd /d/code/build/fltk-app.exe
![cmake-msys-ldd](cmake-msys-ldd.png) ![cmake-msys-ldd](cmake-msys-ldd.png)
#### Вариант 2 - вне msys2 ## Вариант 2 - собираем приложение вне msys2
Сборка через msys2 удобна тогда, когда у нас уже есть готовый проект. Сборка через msys2 удобна тогда, когда у нас уже есть готовый проект.
Однако когда речь идёт о разработке, то мало какая IDE позволит себе роскошь запускать сборку в окружении msys2. Однако когда речь идёт о разработке, то мало какая IDE позволит себе роскошь запускать сборку в окружении msys2.

View File

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -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), так как нынче установка
библиотек и компилятора стала проще.
<!--more-->
Содержание:
{{< 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 <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** подключение необходимых библиотек.
Никакого вывода команда не выдаёт.
Проверяем, что наше приложение не требует никаких дополнительных библиотек.
```bash
ldd main.exe
```
Ничего кроме системных путей тут быть не должно:
![ldd](ldd.png)
После этого можно запускать приложение.
![app](app.gif)
### Сборка через CMake
[FLTK - собираем приложения с msys2 и CMake (часть 2)](/fltk-msys2-cmake)

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB