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

156 lines
5.7 KiB
Markdown
Raw Normal View History

---
title: FLTK - упрощаем себе жизнь с msys2 (часть 2)
2023-01-07 20:13:30 +03:00
date: 2023-01-07T19:46:00+03:00
draft: false
categories:
- cpp
2023-01-03 19:19:01 +03:00
featured_image: thumb.png
lastmod: 2023-12-04T20:36:03+03:00
---
2023-01-07 20:13:30 +03:00
Собираем приложения на FLTK с помощью msys2 и [CMake](https://cmake.org)!
<!--more-->
2023-01-07 20:13:30 +03:00
Предыдущая часть с установкой всего необходимого находится [тут](/fltk-msys2).
2023-01-07 20:13:30 +03:00
## Вариант 1 - собираем приложение внутри msys2
2023-01-07 20:13:30 +03:00
Для CMake хорошим тоном является расположение директорию сборки вне директории проекта.
Поэтому немного изменим структуру нашего проекта:
```
D:\code
├───build
└───fltk-app
├───CmakeLists.txt
└───main.cpp
```
Создаём CmakeLists.txt, который также будет поддерживать статическую сборку:
```cmake
cmake_minimum_required(VERSION 3.2)
project(fltk-app)
option(STATIC_BUILD "Enable static build" ON)
# Ищем библиотеку fltk в системе
# При успешном поиске станут доступны переменные, описанные здесь:
# https://cmake.org/cmake/help/latest/module/FindFLTK.html
find_package(FLTK REQUIRED)
# Указываем исходные файлы проекта
add_executable(fltk-app main.cpp)
if(MINGW)
# Конфигурируем статическую сборку
if(STATIC_BUILD)
set(BUILD_SHARED_LIBS OFF)
set_target_properties(fltk-app PROPERTIES LINK_SEARCH_START_STATIC 1)
set_target_properties(fltk-app PROPERTIES LINK_SEARCH_END_STATIC 1)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
endif()
# Отключаем окно команд
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mwindows")
endif()
# Добавляем путь к заготовкам fltk для компиляции (в случаях, когда они находятся в произвольном месте)
target_include_directories(fltk-app PUBLIC ${FLTK_INCLUDE_DIRS})
# Подключаем библиотеки
target_link_libraries(fltk-app ${FLTK_BASE_LIBRARY})
# Также добавляем необходимые библиотеки при сборке на windows
if(WIN32)
target_link_libraries(fltk-app comctl32)
endif()
```
> Файл проекта пока что адаптирован только для windows.
Переходим в каталог сборки:
```bash
cd /d/code/build
```
Далее необходимо создать файлы для конкретной системы сборки. У нас это **MSYS Makefiles**:
```bash
cmake -G "MSYS Makefiles" /d/code/fltk-app
```
![cmake-msys-gen](cmake-msys-gen.png)
Затем собираем проект:
```bash
cmake --build .
```
![cmake-msys-build](cmake-msys-build.png)
Проверяем с помощью [Dependencies](https://github.com/lucasg/Dependencies), не появилось ли зависимостей:
![depends](depends.png)
2023-01-07 20:13:30 +03:00
## Вариант 2 - собираем приложение вне msys2
Сборка через msys2 удобна тогда, когда у нас уже есть готовый проект.
Однако когда речь идёт о разработке, то мало какая IDE позволит себе роскошь запускать сборку в окружении msys2.
Чтобы избавиться от необходимости его использования, нужно добавить необходимые компоненты в окружение.
Для начала нужно убедиться, что установлен пакет **mingw-w64-i686-make**. В msys2 выполняем:
```bash
pacman -S mingw-w64-i686-make
```
Далее добавляем путь к исполняемым файлам компилятора MinGW в окружение.
* Первый, безопасный вариант, но менее удобный. Открываем окно команд (cmd) и перед сборкой выполняем
```cmd
set PATH=%PATH%;C:\msys64\mingw32\bin
```
* Второй вариант - добавить путь MinGW в глобальное окружение.
Для этого нужно отрыть параметры системы (**SystemPropertiesAdvanced.exe**), во вкладке "Дополнительно" нажать "Переменные среды..."
![SystemPropertiesAdvanced](SystemPropertiesAdvanced.png)
Далее в разделе "Переменные среды пользователя" выбрать "Path" и добавить `C:\msys64\mingw32\bin`:
![PATH.png](PATH.png)
После того, как определились с нужным вариантом, открываем окно в директории сборки и генерируем Makefile:
```cmd
cmake -G "MinGW Makefiles" D:\code\fltk-app
```
После этого запускаем сборку:
```cmd
mingw32-make
```
или
```cmd
cmake --build
```
![mingw32-make.png](mingw32-make.png)
на всякий случай проверяем получившийся исполняемый файл через Dependencies:
![depends2.png](depends2.png)
Упс. При сборке прилинковалась динамическая библиотека вместо статической. Но с этим разберёмся чуть позже.