Статическая линковка SDL2 в Code::Blocks (mingw32)
Я в данный момент изучаю 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 файл пишет следующее:
Если с первыми двумя понятно, что это связано с тем что библиотеки SDL статически не линкуется, то как исправить 3 ошибку? Я знаю что такой файл есть в папке Code::Blocks и что добовление его к проекту исправит эту ошибку (не пробовал) но всё таки я хочу статически связывать все необходимые библиотеки (возможно -static исправил бы 3 ошибку, за то с ним появляются ещё 161 ошибка:
)
Ответы (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.)Через 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.
- Путь к компилятору и отладчику меняете на


