Всех приветствую!
Хочу описать процесс сборки указанной выше библиотеки и задать вопрос. Сразу вопрос может показаться непонятным.
Итак, сборка:
- Имеем установленный MSYS (C:\msys64\ucrt64) плюс минимально необх. библиотеки
pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-cmake
pacman -S mingw-w64-ucrt-x86_64-make
pacman -S mingw-w64-ucrt-x86_64-glew
pacman -S mingw-w64-ucrt-x86_64-glfw
pacman -S mingw-w64-ucrt-x86_64-fontconfig
pacman -S mingw-w64-ucrt-x86_64-freetype
pacman -S mingw-w64-ucrt-x86_64-harfbuzz
pacman -S mingw-w64-ucrt-x86_64-pkg-config
pacman -S mingw-w64-ucrt-x86_64-doxygen
установленные через шелл msys2.exe
-
скачиваем Freetype GL https://github.com/rougier/freetype-gl/tree/master в C:\freetype-gl
-
Читаем в INSTALL.md
**Note**: Harfbuzz examples only work with symbolic links enabled. See <https://github.com/git-for-windows/git/wiki/Symbolic-links>
Поэтому делаем для всех файлов (кроме texture-font.h, texture-font.с, freetype-gl-err.h, freetype-gl-err.c ) в папке C:\freetype-gl\harfbuzz символические ссылки на файлы с теми же именами, но на уровень каталога выше.
(
По умолчанию создание символич. ссылок в Windows не разрешено.
Для этого включаем разрешение на создание символич. ссылок в Windows (в моем случае Windows 11).
Чтобы включить разрешение нужно запустить оснастку Group Policy Editor: Win+R gpedit.msc Конфигурация компьютера->Конфигурация Windows->Параметры безопасности->Локальные политики->Назначение прав пользователя добавляем своего user-а в пункте «Создание символических ссылок».
PS. Если такой оснастки нет, то устанавливаем ее: запускаем терминал с правами администратор и вводим: сначала
FOR %F IN ("%SystemRoot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~*.mum") DO ( DISM /Online /NoRestart /Add-Package:"%F" )
потом
FOR %F IN ("%SystemRoot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~*.mum") DO ( DISM /Online /NoRestart /Add-Package:"%F" )
)
Создание ссылок происходит так:
Запоминаем имя файла находящегося в C:\freetype-gl\harfbuzz, удаляем его из папки. Потом в этом каталоге выполняем
mklink <имя файла> C:\freetype-gl\<имя файла>
Например,
mklink freetype-gl-errdef.h C:\freetype-gl\freetype-gl-errdef.h
будет выдано
symbolic link created for freetype-gl-errdef.h <<===>> C:\freetype-gl\freetype-gl-errdef.h
Вот здесь вопрос(!?): а то делать с файлами freetype-gl-err.h, freetype-gl-err.c у которых нет в папке C:\freetype-gl аналогов с такими же именами?
Например, файл freetype-gl-err.h содержит одну строку «../freetype-gl-err.h», но уровнем выше нет файла с таким именем.
Т.е. нам нужно переделать файл в ссылку, но как будто не существует файла на который он должен ссылатся.
Это относится к этим двум файлам.
Естественно из-за этого сборка будет неудачной.
В репозитории Freetype GL в описании комита на эти файлы указано «Add harfbuzz support for errno stuff».
mkdir C:\freetype-gl\build
далее запускаем шелл C:\msys64\urct64.exe и в нем выполняем
cd C:\freetype-gl\build
Далее возможны два варианта (все команды вып. в шелле C:\msys64\urct64.exe):
3а)
cmake -G "MinGW Makefiles" -Dfreetype-gl_BUILD_HARFBUZZ=ON ..
потом mingw32-make
Отваливается в самом начале на:
[ 26%] Building C object harfbuzz/CMakeFiles/freetype-gl-hb.dir/platform.c.obj
[ 27%] Building C object harfbuzz/CMakeFiles/freetype-gl-hb.dir/texture-atlas.c.obj
[ 28%] Building C object harfbuzz/CMakeFiles/freetype-gl-hb.dir/texture-font.c.obj
In file included from C:\freetype-gl\harfbuzz\texture-font.c:15:
C:\freetype-gl\harfbuzz\freetype-gl-err.h:1:1: error: expected identifier or '(' before '.' token
1 | ../freetype-gl-err.h
| ^
C:\freetype-gl\harfbuzz\texture-font.c:26:3: warning: data definition has no type or storage class
26 | } FT_Errors[] =
| ^~~~~~~~~
C:\freetype-gl\harfbuzz\texture-font.c:26:3: error: type defaults to 'int' in declaration of 'FT_Errors' [-Wimplicit-int]
In file included from C:/msys64/ucrt64/include/freetype2/freetype/fterrors.h:200,
from C:\freetype-gl\harfbuzz\texture-font.c:27:
C:/msys64/ucrt64/include/freetype2/freetype/fterrdef.h:58:3: warning: braces around scalar initializer
58 | FT_NOERRORDEF_( Ok, 0x00,
...
3б)
cmake -G "MinGW Makefiles" -Dfreetype-gl_BUILD_HARFBUZZ=OFF ..
потом mingw32-make
Тут компилирует почти все примеры библиотеки, отваливается на
[ 94%] Building C object demos/CMakeFiles/markup.dir/markup.c.obj
[ 96%] Linking C executable markup.exe
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\markup.dir/objects.a(markup.c.obj):markup.c:(.text+0x15): undefined reference to `FcInit'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\markup.dir/objects.a(markup.c.obj):markup.c:(.text+0x21): undefined reference to `FcNameParse'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\markup.dir/objects.a(markup.c.obj):markup.c:(.text+0x3c): undefined reference to `FcConfigSubstitute'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\markup.dir/objects.a(markup.c.obj):markup.c:(.text+0x48): undefined reference to `FcDefaultSubstitute'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\markup.dir/objects.a(markup.c.obj):markup.c:(.text+0x60): undefined reference to `FcFontMatch'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\markup.dir/objects.a(markup.c.obj):markup.c:(.text+0x70): undefined reference to `FcPatternDestroy'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\markup.dir/objects.a(markup.c.obj):markup.c:(.text+0xc5): undefined reference to `FcPatternGet'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\markup.dir/objects.a(markup.c.obj):markup.c:(.text+0x113): undefined reference to `FcPatternDestroy'
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [demos\CMakeFiles\markup.dir\build.make:112: demos/markup.exe] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:902: demos/CMakeFiles/markup.dir/all] Error 2
mingw32-make: *** [Makefile:145: all] Error 2
Но можно сказать уже успех.
Делитесь своими мыслями по поводу описанного.
Кто как собирает с меньшими издержками?
Что делать со ссылками непонятно куда?
Заранее благодарен за содержательные комментарии.