Как стать автором
Обновить

Как собрать GLFW для Windows с под wsl

Уровень сложностиСредний

После многих часов брождения в глобальной сети интернет, в поисках решения увлекательной* задачи компиляции opengl библиотеки glfw для шындовс с под wsl, был сделан вывод что, как-то всё пустовато на эту тему, поэтому вот краткий туториал для этого безобразия.

Сперва, на всякий случай, обновите версию wsl.

wsl --update

Следом следует установить необходимый toolchain для компиляции всего проекта. Таким toolchain`ом является набор инструментов mingw-w64 для сборки windows приложений.

sudo apt install mingw-w64

Дополнительно требуются cmake и make

sudo apt install cmake && sudo apt install make

На этом этапе, с точки зрения утилит для сборки проекта, всё - готово.

Теперь нужно заполучить исходный код библиотеки glfw, сделать это можно скачиванием сорсов из github, или более гуманным образом, добавлением субмодуля в git проекта.

git submodule add https://github.com/glfw/glfw lib/glfw
git submodule init
git submodule update

Эти команды загрузят весь исходный код glfw в папку lib/glfw.

Ну и финальным аккордом - хочется запустить cd lib/glfw && cmake . но, не тут-то было.

Запустив данную сборку, мы начнём собирать glfw под linux, что как минимум - невозможно с под wsl по умолчанию, из-за нехватки нужных для этого утилит, да и сидим мы на шындовс, а это, скорее всего, значить наличие дискретной видеокарты с драйверами реализующими последние версии opengl, vulkan.

Поэтому нужно как-то сказать cmake`у нашу target платформу, что, на удивление, достаточно просто, смотрите.

Вместе с исходным кодом glfw, идёт также и lib/glfw/CMake/x86_64-w64-mingw32.cmake файл, скармливая который cmake`у, можно добиться успешной компиляции glfw под windows!

cd lib/glfw && cmake . -DCMAKE_TOOLCHAIN_FILE=./CMake/x86_64-w64-mingw32.cmake && make

Ну и собственно - всё.

Осталось только указать путь скомпилированной статической библиотеке линкеру по пути lib/glfw/src/libglfw3.a ну и ещё -lgdi32 (требование glfw).

x86_64-w64-mingw32-gcc /* все объектные файы */ -o bin/main lib/glfw/src/libglfw3.a -lgdi32

Voilà!

Также не забываем собирать весь собственный код не с помощью gcc (так как мы получим linux executable, который нельзя запустить в виндовс), а x86_64-w64-mingw32-gcc

Ну и бонусом, оставлю свой makefile для автоматизации сборки всего этого + cglm, glad.

default-target: all
.PHONY: default-target

ifndef target
$(error target is NOT defined)
endif

CFLAGS = -std=c11 -O3 -g -Wall -Wextra -Wpedantic
CFLAGS += -Ilib/cglm/include -Ilib/glad/include -Ilib/glfw/include -Ilib/stb
LDFLAGS = lib/cglm/libcglm.a lib/glad/src/gl.o lib/glfw/src/libglfw3.a

ifeq ($(target), linux)
	CC = gcc
	CFLAGS +=
	LDFLAGS +=
	CMAKEFLAGS +=
else ifeq ($(target), windows)
	CC = gcc
	CFLAGS +=
	LDFLAGS += -lgdi32
	CMAKEFLAGS += -G "MinGW Makefiles"
else ifeq ($(target), darwin)
	CC = clang
	CFLAGS +=
	LDFLAGS += -framework OpenGL -framework IOKit -framework Cocoa -framework CoreVideo
else ifeq ($(target), wsl)
	CC = x86_64-w64-mingw32-gcc
	CFLAGS +=
	LDFLAGS += -lgdi32
endif

SRC := $(wildcard src/*.c) $(wildcard src/**/*.c) $(wildcard src/**/**/*.c) $(wildcard src/**/**/**/*.c)
OBJ := $(SRC:.c=.o)

.PHONY: all clean

all: compile link run

lib:
	cd lib/glfw && cmake . -DCMAKE_TOOLCHAIN_FILE=./CMake/x86_64-w64-mingw32.cmake && make
	cd lib/cglm && cmake . -DCGLM_STATIC=ON && make
	cd lib/glad && $(CC) -c src/gl.c -o src/gl.o -Iinclude

compile: $(OBJ)

%.o: %.c
	$(CC) -c $< -o $@ $(CFLAGS)

link:
	$(CC) $(OBJ) -o ./bin/main.exe $(LDFLAGS)

run:
	./bin/main.exe

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.