Статическая линковка SDL2 в Code::Blocks (mingw32)

Рейтинг: 0Ответов: 1Опубликовано: 16.04.2023

Я в данный момент изучаю SDL2, перешёл с SFML в котором была статическая линковка, на тот момент я пользовался VS22++, на официальном сайте SFML была информация о том, как статически слинковать библиотеку с проектом. Но вот у SDL я такого не нашёл, облазил почти весь интернет, находил информацию как это сделать, но у меня не получалось. Например, я пробовал в "других опциях компоновщика" писать -static (или включать флаг Static linking в "Флаги компилятора") но с ним мне выдавало кучу ошибок, или в "Библиотеки компоновщика" из папки lib подключать все файлы ~.a, но программа всё равно требовала SDL2.dll и SDL2_image.dll (даже если они были в папке с .cpp файлом, а у .exe файла уже не было)

PS: Пользуюсь Windows 10 Pro, Code::Blocks mingw32

Добавлено: При попытке запустить .exe файл пишет следующее:

Ошибка 1: SDL2_image.dll Ошибка 2: SDL2.dll Ошибка 3: libwinpthread.dll

Если с первыми двумя понятно, что это связано с тем что библиотеки SDL статически не линкуется, то как исправить 3 ошибку? Я знаю что такой файл есть в папке Code::Blocks и что добовление его к проекту исправит эту ошибку (не пробовал) но всё таки я хочу статически связывать все необходимые библиотеки (возможно -static исправил бы 3 ошибку, за то с ним появляются ещё 161 ошибка: -static)

Ответы

▲ 0Принят

Есть два способа.

  1. Ручной.

    Полезть в файл ??/lib/pkgconfig/sdl2.pc, который вы скачали вместе с SDL2, и посмотреть там флаги в строке Libs.private. (По идее, для SDL2_image нужно бы сделать то же самое, но там никаких флагов не указано.)

    Скопировать их во флаги линковщика, и добавить -static. (Это все после -lmingw32 -lSDL2main -lSDL2, которые уже должны там быть.)

    Убедиться, что папка с libSDL.a добавлена в пути поиска линковщика. Тогда из-за -static он должен выбрать именно этот файл, что нам и нужно, и проигнорировать libSDL2.dll.a или SDL2.dll. (То же самое с libSDL2_image.a.)

  2. Через MSYS2 и pkg-config.

    Как обычно, я рекомендую заменить обычный MinGW на MSYS2, потому что там всегда свежая версия компилятора, и распространенные библиотеки (включая SDL2) можно поставить одной командой.

    В том числе там есть Pkg-Config, который говорит нужные флаги для использования тех или иных библиотек, чтобы не надо было лезть руками в .pc-файлы (которые для него и предназначены).

  • Сносите свой MinGW.

  • Ставите MSYS2.

  • Запускаете его ярлыком MSYS2 UCRT64. Если сделано правильно, в открышейся консоли будет написано UCRT64 фиолетовыми буквами. (в чем разница между ярлыками)

  • Обновляетесь командой pacman -Syuu. Если при этом консоль закроется - открыть заново и повторить команду для завершения обновления.

  • Ставите себе компилятор, отладчик, Pkg-Config, и SDL2.

    pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb mingw-w64-ucrt-x86_64-pkgconf mingw-w64-ucrt-x86_64-SDL2 mingw-w64-ucrt-x86_64-SDL2_image
    
  • Пробуете скомпилировать командой g++ my_code.cpp -static `pkg-config --libs --cflags --static sdl2 SDL2_image`.

  • Если все успешно, настраиваете CodeBlocks:

    • Путь к компилятору и отладчику меняете на C:\msys64\ucrt64\bin.
    • Во флаги компилятора пишете выхлоп pkg-config --cflags sdl2 SDL2_image.
    • Во флаги линковщика пишете -static и выхлоп pkg-config --libs --static sdl2 SDL2_image.