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

5.7 KiB
Raw Blame History

title date draft categories featured_image lastmod
FLTK - упрощаем себе жизнь с msys2 (часть 2) 2023-01-07T19:46:00+03:00 false
cpp
thumb.png 2023-12-04T20:36:03+03:00

Собираем приложения на FLTK с помощью msys2 и CMake!

Предыдущая часть с установкой всего необходимого находится тут.

Вариант 1 - собираем приложение внутри msys2

Для CMake хорошим тоном является расположение директорию сборки вне директории проекта. Поэтому немного изменим структуру нашего проекта:

D:\code
    ├───build
    └───fltk-app
          ├───CmakeLists.txt
          └───main.cpp

Создаём CmakeLists.txt, который также будет поддерживать статическую сборку:

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.

Переходим в каталог сборки:

cd /d/code/build

Далее необходимо создать файлы для конкретной системы сборки. У нас это MSYS Makefiles:

cmake -G "MSYS Makefiles" /d/code/fltk-app

cmake-msys-gen

Затем собираем проект:

cmake --build .

cmake-msys-build

Проверяем с помощью Dependencies, не появилось ли зависимостей:

depends

Вариант 2 - собираем приложение вне msys2

Сборка через msys2 удобна тогда, когда у нас уже есть готовый проект. Однако когда речь идёт о разработке, то мало какая IDE позволит себе роскошь запускать сборку в окружении msys2. Чтобы избавиться от необходимости его использования, нужно добавить необходимые компоненты в окружение.

Для начала нужно убедиться, что установлен пакет mingw-w64-i686-make. В msys2 выполняем:

pacman -S mingw-w64-i686-make

Далее добавляем путь к исполняемым файлам компилятора MinGW в окружение.

  • Первый, безопасный вариант, но менее удобный. Открываем окно команд (cmd) и перед сборкой выполняем

    set PATH=%PATH%;C:\msys64\mingw32\bin
    
  • Второй вариант - добавить путь MinGW в глобальное окружение.

    Для этого нужно отрыть параметры системы (SystemPropertiesAdvanced.exe), во вкладке "Дополнительно" нажать "Переменные среды..."

    SystemPropertiesAdvanced

    Далее в разделе "Переменные среды пользователя" выбрать "Path" и добавить C:\msys64\mingw32\bin:

    PATH.png

После того, как определились с нужным вариантом, открываем окно в директории сборки и генерируем Makefile:

cmake -G "MinGW Makefiles" D:\code\fltk-app

После этого запускаем сборку:

mingw32-make

или

cmake --build

mingw32-make.png

на всякий случай проверяем получившийся исполняемый файл через Dependencies:

depends2.png

Упс. При сборке прилинковалась динамическая библиотека вместо статической. Но с этим разберёмся чуть позже.