47 / 36 / 14
Регистрация: 23.12.2015
Сообщений: 187
|
||||||
1 | ||||||
Компиляция кода с SDL2 под Windows в MinGW31.01.2018, 21:23. Показов 4714. Ответов 16
Метки нет Все метки)
(
У меня виндовс семь, система 64битная. Компилятор брал сравнительно недавно (после перестановки винды) отсюда http://www.msys2.org/ (расписываю это, так как есть подозрения, что чего-то "недоставил").
Тогда после выполнения их (по ссылке) инструкций, выяснилось, что собственно компилятора то и нет, но поставил в MSYS2 пакет mingw-w64-x86_64-gcc - компилятор появился, начал работать. На днях захотелось поэкспериментировать с SDL2, когда-то под линуксом с ним работал, там он тривиально компилился. Поставил у себя пакет mingw-w64-x86_64-SDL2 Уже второй день не могу собрать простейшую тестовую программу((( Вот она
Что сделано для решения проблемы. Выяснил, что видимо необходимы флаги -lmingw32 -lSDL2main -lSDL2 Выяснил, что возможно надо прописать пути к библиотекам. Но в моем случае компиляция, сводящаяся к этой строке c++ -I"C:/msys64/mingw64/include/SDL2" -L"C:/msys64/mingw64/lib" C:\SDL2\sdl2.cpp -lmingw32 -lSDL2main -lSDL2 Дает вывод ошибок (см. скрин):
0
|
|
31.01.2018, 21:23 | |
Ответы с готовыми решениями:
16
Компиляция серьезной графики под Mingw Компиляция кода под конкретную ОС MinGW подключение библиотеки lib из под Windows Компиляция простейшего кода на C++ под GNU/Linux |
17111 / 9130 / 2236
Регистрация: 30.01.2014
Сообщений: 15,917
|
||||||
31.01.2018, 21:45 | 2 | |||||
![]() Решение
Ajir, Если
-lSDL2main линкуется, то точка входа должна быть такой:
2
|
47 / 36 / 14
Регистрация: 23.12.2015
Сообщений: 187
|
|
31.01.2018, 21:54 [ТС] | 3 |
DrOffset, Попробовал, сразу собралось, появился экзешник! Уже большое спасибо, но:
1. Это что, получается если хочу большую программу писать, то она будет не с main, а с SDL_main как главной функцией? 2. Почему под линухой такого не требовало, SDL же кроссплатформа? И что будет если я под виндой так напишу, а потом под линуху код перемещу? Он там такой скомпилится или это чисто для винды вещь?!
0
|
17111 / 9130 / 2236
Регистрация: 30.01.2014
Сообщений: 15,917
|
|
31.01.2018, 22:04 | 4 |
main определяется внутри библиотеки SDL2main , и вызывает внутри себя функцию SDL_main , которую пользователю предлагается определить в качестве точки входа. Сделано это для того, чтобы не заставлять пользователя вручную выполнять инициализацию и деинициализацию библиотеки. Если это не требуется, то пожалуйста, можно использовать main, но инициализацию управляющих структур библиотеки в этом случае следует выполнить самостоятельно (и, естественно, линковать SDL2main уже не нужно).Вероятно, SDL2main "под линухой" не линковалась (в некоторых дистрибутивах она и вовсе отсутствует).
1
|
47 / 36 / 14
Регистрация: 23.12.2015
Сообщений: 187
|
|
01.02.2018, 05:54 [ТС] | 5 |
DrOffset, Спасибо, все постепенно проясняется. Но что писать, чтобы скомпилировать просто main(), где самому включать SDL2? Собственно флаги
прописал лишь потому, что когда писал просто -lSDL2, выводило "нету WinMain"((
Ну да, я же точно не писал под линухой в строке компиляции такого флага...
0
|
3545 / 2215 / 402
Регистрация: 09.09.2017
Сообщений: 9,228
|
||||||
01.02.2018, 11:42 | 6 | |||||
А вот и не обязательно. Так тоже работает. Собственно, лучше так и писать, ибо стандарт Си.
Linux: Код
LDFLAGS += -lSDL2 -lGL -lGLU Код
LDFLAGS += -lSDL2 -static-libgcc -static-libstdc++ -lmingw32 -lSDL2main -lopengl32 -lglu32 -lgdi32 -mconsole -mwindows -static-libgcc -static-libstdc++ чтобы не таскать gcc-шные либы отдельно на те машины где их нет. У меня проект смешанный, С/С++ так что подключаю обе-lmingw32 какие-то mingw-шные библиотеки, вроде бы для GUI-lSDL2 -lSDL2main внутренности SDL (кстати, никто не знает как подключить SDL статически?)-lopengl32 -lglu32 очевидно, OpenGL+GLU. То что обычно подключается просто через -lGL -lGLU-lgdi32 предположительно, библиотека для WinAPI-mconsole -mwindows обозначают что приложение обладает и оконным и консольным интерфейсом. Что мешало включить их по умолчанию как в Linux мне неизвестно. Возможно, "особенности" архитектуры windows или возможность создания невидимых приложений.Кстати, порядок аргументов имеет значение! Если хотите, могу выложить свой makefile для кроссплатформенной сборки, lin32 + lin64 + win32 + win64 Добавлено через 5 минут Собственно, вот. Если кто предложит как его улучшить буду благодарен Кликните здесь для просмотра всего текста
Код
progname := res/prog srcdir = src files = main CFLAGS = -Os -Wall -MD -MP -MT build/$(*F).$(arch).o -MF build/dep/$(@F).mk CXXFLAGS = $(CFLAGS) -std=c++11 LDFLAGS = -lm -lSDL2 # Выбор архитектуры #arch := arch_lin32 arch := arch_lin64 #arch := arch_win32 #arch := arch_win64 # Выбор режима mode := mode_debug #mode := mode_release ############################################################################################## ############################################################################################## # Реализации ############################################################################################## ############################################################################################## CC = $(COMP_PREFIX)gcc$(COMP_SUFFIX) CXX= $(COMP_PREFIX)g++$(COMP_SUFFIX) AR = $(COMP_PREFIX)gcc-ar$(COMP_SUFFIX) RLIB=$(COMP_PREFIX)gcc-ranlib$(COMP_SUFFIX) #разделитель слов в одной записи _flagdiv_ = _.~№!string_to_split_parameters_of_different_architectures!№~._ _divider_ = _.~№!I_hope_there_will_not_be_this_string_in_flags_or_file_names!№~._ #немного черной магии чтобы получить символ пробела SPACE := $(subst O_O, ,O_O) compiler = $(_flagdiv_)arch_win32 i686-w64-mingw32- -win32\ $(_flagdiv_)arch_win64 x86_64-w64-mingw32- -win32\ spec_cflags = $(_flagdiv_)arch_lin32 -m32 -isystem /usr/include spec_cflags += $(_flagdiv_)arch_lin64 spec_cflags += $(_flagdiv_)arch_win32 spec_cflags += $(_flagdiv_)arch_win64 spec_ldflags = $(_flagdiv_)arch_lin32 -m32 -B/usr/lib/gcc/i686-linux-gnu/6 -lGL -lGLU spec_ldflags += $(_flagdiv_)arch_lin64 -lGL -lGLU spec_ldflags += $(_flagdiv_)arch_win32 -static-libgcc -static-libstdc++ -lmingw32 -lSDL2main -lopengl32 -lglu32 -lgdi32 -mconsole -mwindows -lmingw32 -lSDL2main -lSDL2 -mwindows -lSDL2.dll spec_ldflags += $(_flagdiv_)arch_win64 -static-libgcc -static-libstdc++ -lmingw32 -lSDL2main -lopengl32 -lglu32 -lgdi32 -mconsole -mwindows res_flags = $(_flagdiv_)mode_debug -gdwarf-2 -DTODO_WARN prognames = arch_lin32$(_divider_)32\ arch_lin64$(_divider_)64\ arch_win32$(_divider_)32.exe\ arch_win64$(_divider_)64.exe\ #Еще черная магия с подстановками. Рассмотрим на примере CFLAGS с добавлением псевдо-переменных # VAR_A = $(subst $(SPACE),$(_divider_),$(spec_cflags)) - заменяем в исходной строке пробелы на $(_divider_). Теперь пробелов в строке нет # VAR_B = $(subst $(_flagdiv_), ,$(VAR_A)) - в полученной строке заменяем $(_flagdiv_) на пробелы. Теперь переменная разделена пробелами на длинные строки с arch_ в начале # VAR_C = $(filter $(arch)$(_divider_)%,$(VAR_B)) - выделяем из переменной строки, начинающиеся на $(arch), то есть на заданную архитектуру. Например, на arch_lin32. Теперь строка содержит только нужные для данной архитектуры параметры,но они все еще разделены $(_divider_)'ами # VAR_D = $(subst $(_divider_), ,$(VAR_C)) - меняем $(_divider_)'ы на пробелы. Теперь параметры разделены как надо, пробелами. Но в начале все еще есть $(arch), который компилятору не нужен # CFLAGS = $(filter-out $(arch),$(VAR_D)) - отбрасываем $(arch) #Теперь переменная содержит только нужные флаги COMP_PREFIX = $(word 2,$(subst $(_divider_), ,$(filter $(arch)$(_divider_)%,$(subst $(_flagdiv_), ,$(subst $(SPACE),$(_divider_),$(compiler)))))) COMP_SUFFIX = $(word 3,$(subst $(_divider_), ,$(filter $(arch)$(_divider_)%,$(subst $(_flagdiv_), ,$(subst $(SPACE),$(_divider_),$(compiler)))))) CFLAGS += $(filter-out $(arch),$(subst $(_divider_), ,$(filter $(arch)$(_divider_)%,$(subst $(_flagdiv_), ,$(subst $(SPACE),$(_divider_),$(spec_cflags)))))) CFLAGS += $(filter-out $(mode),$(subst $(_divider_), ,$(filter $(mode)$(_divider_)%,$(subst $(_flagdiv_), ,$(subst $(SPACE),$(_divider_),$(res_flags)))))) LDFLAGS := $(filter-out $(arch),$(subst $(_divider_), ,$(filter $(arch)$(_divider_)%,$(subst $(_flagdiv_), ,$(subst $(SPACE),$(_divider_),$(spec_ldflags)))))) $(LDFLAGS) #тут это извращение уже не нужно, параметры простые resname := $(progname)$(word 2,$(subst $(_divider_), ,$(filter $(arch)$(_divider_)%,$(prognames)))) objects = $(addprefix build/,$(addsuffix .$(arch).o,$(files))) .PHONY: clean cleanall all: $(objects) mkdir -p res $(CXX) $(objects) $(LDFLAGS) -o $(resname) remake: clean all clean: rm -f $(objects) rm -f $(resname) rm -rf build/dep release: allarch rm -rf build cleanall: rm -rf build rm -f $(progname)* allarch: # make -r -j 10 arch=arch_lin32 make -r -j 10 arch=arch_lin64 make -r -j 10 arch=arch_win32 make -r -j 10 arch=arch_win64 build/%.$(arch).o: $(srcdir)/%.c mkdir -p build $(CC) -c $(CFLAGS) $< -o $@ build/%.$(arch).o: $(srcdir)/%.cpp mkdir -p build $(CXX) -c $(CXXFLAGS) $< -o $@ -include $(shell mkdir -p build/dep) $(wildcard build/dep/*)
1
|
17111 / 9130 / 2236
Регистрация: 30.01.2014
Сообщений: 15,917
|
||||||||||||||||
01.02.2018, 13:54 | 7 | |||||||||||||||
Это становится возможным благодаря макросу
main в SDL_main в этом случае.Вообще, описание всей этой ситуации, а также того, какими способами она может быть решена находится в файле SDL_main.h - можно полюбопытствовать.В частности, если пользователь предоставляет свою версию main , то перед включением SDL.h ему потребуется определить макрос SDL_MAIN_HANDLED . Вот как-то так:
SDL_main ,Кликните здесь для просмотра всего текста
1
|
3545 / 2215 / 402
Регистрация: 09.09.2017
Сообщений: 9,228
|
|
01.02.2018, 14:36 | 8 |
Значит разработчики SDL молодцы, сохранили совместимость и со стандартом и умудрились добавить противоречащий ему WinMain.
1
|
47 / 36 / 14
Регистрация: 23.12.2015
Сообщений: 187
|
|
01.02.2018, 19:38 [ТС] | 9 |
COKPOWEHEU, DrOffset, Спасибо за содержательные ответы! Ставлю плюсы. По сути отвечу позже, наверно завтра, сейчас нет не сколько времени, сколько сил во всем разобраться основательно.
Добавлено через 2 минуты COKPOWEHEU, Блин, по непонятной причине не могу "плюсануть" тебя. Придется счас отписаться о ситуации на подфоруме соответствующем. Добавлено через 2 минуты А не, все в порядке)
0
|
47 / 36 / 14
Регистрация: 23.12.2015
Сообщений: 187
|
||||||
10.10.2018, 22:14 [ТС] | 10 | |||||
COKPOWEHEU, DrOffset, Еще раз спасибо, что помогли. Снова вернулся к экспериментам с SDL2
На данный момент умею следующей программой запускать графику в разрешении не заданном системой, а какое я хочу и выводить картинку в заданный прямоугольник. Моя программа
0
|
Неэпический
|
|
10.10.2018, 22:41 | 11 |
Ajir, так SDL_RenderCopy не справляется?
1
|
47 / 36 / 14
Регистрация: 23.12.2015
Сообщений: 187
|
|
10.10.2018, 22:53 [ТС] | 12 |
Croessmah, Посмотрел код по ссылке. Там что, реализовано путем вывода нужных одинаковых картинок по очереди циклами?
0
|
3545 / 2215 / 402
Регистрация: 09.09.2017
Сообщений: 9,228
|
|
11.10.2018, 11:52 | 13 |
А чего вы хотите добиться в конечном итоге? Потому что игры с разрешением экрана (кстати, было бы неплохо восстанавливать за собой!) больше похожи на разработку игры. А там лучше сразу использовать OpenGL (возможно, уже Vulkan), а тот же SDL для общения с операционкой, но не для графики.
1
|
47 / 36 / 14
Регистрация: 23.12.2015
Сообщений: 187
|
|
12.10.2018, 17:19 [ТС] | 14 |
COKPOWEHEU,
>А чего вы хотите добиться в конечном итоге? Потому что игры с разрешением экрана (кстати, было бы неплохо >восстанавливать за собой!) больше похожи на разработку игры. А там лучше сразу использовать OpenGL (возможно, уже >Vulkan), а тот же SDL для общения с операционкой, но не для графики. Ну да, я занят любительской разработкой игры. Мне в итоге для "счастья" нужны функции немногие, особых спецэффектов в игре пока не хочу 1. Запустить графику и в заданном разрешении (из-за этого связался с SDL) 2. Нарисовать точку/линию/прямоугольник нужного цвета. 3. Вывести на экран текст, включая русский, размером буквы 8 на 10 или кратный. 4. Нарисовать в прямоугольник картинку из файла png так чтобы она была растянута по размерам прямоугольник. 5. Покрыть прямоугольник текстурой по размеру текстуры. 6. Сохранить/восстановить из сохранения экран. Большинство этого давно есть через следующую кривую реализацию. Взял себя библиотеку отсюда MinGW + Graphics.h It's work) MinGW + Graphics.h It's work) И для png добавил свои функции на gdiplus. НО: 1. Так не изменишь разрешение. Пробовал экспериментировать с счас не помню имен какими функциями winapi которые выставляют разрешение экрана, а при выходе восстанавливать прежнее, но в лучшем случае это меняет расположение иконок на рабочем столе, что ни к чему... 2. Я по хорошему не могу такой чисто учебный и не свободный код вставлять в будущий готовый проект. 3. Также эта "либа" не умеет хорошо работать с размером шрифта, то что могу - текст растягивается только по вертикали, но не по горизонтали. Вот. Чего хочу добиться в конечном итоге. Что тогда посоветуете?! Добавлено через 1 час 37 минут Добавка. Забыл написать. Разумеется хочу и функции работы с мышью, чтение текущих координат и нажата ли в данный момент левая/правая кнопка мыши.
0
|
3545 / 2215 / 402
Регистрация: 09.09.2017
Сообщений: 9,228
|
|
12.10.2018, 19:21 | 15 |
Не уверен что в SDL есть функции рисования линий. Хотя мне они и не были нужны, поэтому утверждать не буду. Про openGL могу сказать точно - умеет.
SDL_ttf умеет создавать текстуры (SDL-ные) с текстом любого размера, в том числе в кодировке unicode (то есть не только русский и английский текст). Опять же, не уверен на счет SDL, но вот OpenGL с растяжением и прочими изменениями картинки справляется. Для загрузки можно использовать тот же SDL_image, что использовали вы. Вот это довольно странное требование. Может, проще сохранять расположение всех объектов на экране и при загрузке просто отрисовывать их? Впрочем, SDL вроде бы умеет сохранять текстуру (surface), в которую проводилось рисование. SDL вполне справляется с этим. . В общем, использование SDL (или SFML, возможно - я с ним дела не имел, ничего сказать не могу) вполне оправдано. Ну разве что для вывода графики я бы все-таки использовал OpenGL. Благо вот как раз OpenGL'ные библиотеки поставляются прямо с системой и лишних зависимостей не потащат. В отличие от SDL, где тащить библиотеки все-таки придется. Я не нашел способа встраивать их статически. Могу ошибаться, но кажется, вы воспринимаете OpenGL и SDL как "конкурентов"? Это не так, у них разные ниши и они хорошо дополняют друг друга. OpenGL это работа с графикой и только с ней. Там нет даже средств загрузки текстур или создания окон, не говоря уж про шрифты, сетевое взаимодействие, звук и тому подобное. Вот для этого вполне можно использовать SDL.
0
|
47 / 36 / 14
Регистрация: 23.12.2015
Сообщений: 187
|
||||||
18.11.2018, 08:49 [ТС] | 16 | |||||
Почему такой код
0
|
Неэпический
|
|
19.11.2018, 00:28 | 17 |
Ваша функция
DrawPNG очищает всё, что было нарисованно до её вызова и потом рисует изображение, причем зачем-то еще содержимое рендера выводит.Уберите из нее вызовы SDL_RendeClear и SDL_RenderPresent .Соответственно, в main: C++ SDL_RenderClear(ren);//Очищает рендер перед выводом изображений DrawPNG(400,100,1000,700,"camp008.png"); DrawPNG(100,100,200,200,"camp008.png"); SDL_RenderPresent(ren); //Выводит нарисованное
0
|
19.11.2018, 00:28 | |
Помогаю со студенческими работами здесь
17
Компиляция под Windows x64
Компиляция в g++ из MinGW Компиляция в MSYS (MinGW) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |