Сборка приложения С++ с библиотекой FLTK на Windows

27 нояб. 2024 г. 19:23:48 MSK

Использование Msys2 с компилятором MinGW

Введение

Речь будет идти про программы, написанные на С++ с использованием библиотеки FLTK. Это может пригодится как при переносе приложения из Linux’а на Windows, так и для обычного использования графической библиотеки на Windows.

MSYS2

Итак, самый простой способ получить FLTK – это установать на Windows компилятор MinGW и MSYS2. Кстати, последняя может поставляться вместе с MinGW.

MSYS2 предоставляет библиотеки для разработки. Причём всё это делается на основе Cygwin – Unix-подобной среды. Благодаря этому можно выполнять программы из Unix. После установки MSYS2 будет доступен полноценный shell терминал, из которого необходимо установить нужные пакеты. Самое главное, что уже собранная компилятором MinGW версия FLTK будет доступна в качестве пакета. Поэтому ничего собирать для этого не нужно.

Порядок такой: сначала обновляем БД пакетов и устанавливаем свежие версии:

pacman -Syu

Пакетный менеджер здесь pacman из дистрибутива Arch.

После этого указываем: основные пакеты для разработки (base-devel), компилятор (если не был установлен MinGW отдельно) на выбор. Я предпочёл mingw-w64-x86-64-g++.

pacman -S base-devel mingw-w64-x86-64-g++

Теперь выбираем версию fltk, в зависимости от установленного компилятора. Можно поискать название пакет через команду pacman -Ss fltk:

fltk_pacman

Полностью копируем нужное название и подставляем в команду pacman -S

Сборка программы через Makefile

Сборку программ осуществляем непосредственно в unix окружении. Поэтому проект перемещаем в директорию home. Полный путь к ней будет как C:\msys64\home\user (вместо msys64 может быть просто msys).

Я собираю проекты через Makefile’ы. Рабочий пример:

 1SRCMODULES = puzzle.cpp gameplay.cpp menu_callbacks.cpp solution_algorithm.cpp img_handler.cpp \
 2	image_converter/resources.cpp main.cpp
 3OBJMODULES = $(SRCMODULES:.cpp=.o)
 4CXX = g++
 5CXXFLAGS = -Wall -g `fltk-config --cxxflags`
 6LIBS = -static `fltk-config --ldstaticflags` -lfltk -lfltk_images \
 7	-ljpeg -lpng -lpng16 -lstdc++ -lpthread -lm -lz -luuid -mwindows
 8
 9all: puzzle.exe
10
11%.o: %.cpp
12	$(CXX) $(CXXFLAGS) -c $< -o $@
13
14puzzle.exe: $(OBJMODULES)
15	$(CXX) $^ $(LIBS) -o $@
16
17ifneq (clean, $(MAKECMDGOALS))
18-include deps.mk
19endif
20
21deps.mk: $(SRCMODULES)
22	$(CC) -MM $^ > $@
23
24clean:
25	rm -f *.o main

Стоит отметить 5-7 строки. В документации нашёл информацию, что FLTK предоставляет скрипт fltk-config. При передаче ему определённых опций он возвращает некоторые значения. А именно: –cxxflags возвратит флаги для компилятора g++. Этот случай отрабатывается нормально. Однако для статической линковки будет недостаточно использования одного –ldstaticflags. Поэтому приходится вручную указывать все библиотеки, которые войдут в итоге в исполяемый файл.

CMake

Для интереса собрал эту же программу посредством генератора Cmake. CMakeLists.txt будет таков:

 1cmake_minimum_required(VERSION 3.31)
 2project(puzzle)
 3set(BUILD_SHARED_LIBS OFF)
 4set(CMAKE_EXE_LINKER_FLAGS "-static -mwindows")
 5set(SOURCE main.cpp image_converter/resources.cpp gameplay.cpp img_handler.cpp 
 6    menu_callbacks.cpp puzzle.cpp solution_algorithm.cpp) 
 7add_executable(main ${SOURCE})
 8target_link_libraries(main libfltk.a libfltk_images.a libcomctl32.a libgdiplus.a 
 9                      libws2_32.a libpng.a libpng16.a libstdc++.a libpthread.a libm.a 
10                      libz.a libuuid.a)

Генерируем Makefile:

cmake_1

Далее уже собираем из полученного Makefile’а:

cmake_2

Получаем программу без внешних зависимостей:

cmake_3

Опять же, в target_link_libraries снова приходится указывать библиотеки для статической линковки, даже если использовать find_package(FLTK REQUIRED), который предоставлен из пакета и помогает искать библиотеки. Никакие option(STATIC_BUILD "Enable static build" ON), set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") не спасают. Сам способ описывается здесь: https://mmote.ru/fltk-msys2-cmake

Эти способы пригодны для ручного управления проектом. Если пользоваться какой-нибудь IDE, то лучше воспользоваться документацией, либо поискать статьи, относящиеся к конкретной среде разработки.