Разделение статьи
@ -1,3 +1,3 @@
|
|||||||
---
|
---
|
||||||
title: "Программирование на C/C++"
|
title: "Разработка на C/C++"
|
||||||
---
|
---
|
@ -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"). Значит, сейчас будем её собирать.
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
170
content/posts/fltk-msys2/index.md
Normal 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)
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
BIN
content/posts/fltk-msys2/thumb.png
Normal file
After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |