После многих часов брождения в глобальной сети интернет, в поисках решения увлекательной* задачи компиляции 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