Использование Msys2 с компилятором MinGW
Речь будет идти про программы, написанные на С++ с использованием библиотеки FLTK. Это может пригодится как при переносе приложения из Linux’а на Windows, так и для обычного использования графической библиотеки на Windows.
Итак, самый простой способ получить 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:
Полностью копируем нужное название и подставляем в команду pacman -S
Сборку программ осуществляем непосредственно в 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. 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:
Далее уже собираем из полученного Makefile’а:
Получаем программу без внешних зависимостей:
Опять же, в 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, то лучше воспользоваться документацией, либо поискать статьи, относящиеся к конкретной среде разработки.