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

156 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: FLTK - упрощаем себе жизнь с msys2 (часть 2)
date: 2023-01-07T19:46:00+03:00
draft: false
categories:
- cpp
featured_image: thumb.png
lastmod: 2023-12-04T20:36:03+03:00
---
Собираем приложения на FLTK с помощью msys2 и [CMake](https://cmake.org)!
<!--more-->
Предыдущая часть с установкой всего необходимого находится [тут](/fltk-msys2).
## Вариант 1 - собираем приложение внутри msys2
Для 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)
## Вариант 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)
Упс. При сборке прилинковалась динамическая библиотека вместо статической. Но с этим разберёмся чуть позже.