«Гопник-2»: разные mingw
Надо по-быстрому дописать посты про портирования игры на «Виндоуз», пока свежо в памяти. Так что продолжу.
Сильнее всего меня удивило в процессе, что поведение mingw, — инструментария для компиляции приложений под «Виндоуз», различается под разными операционными системами.
Поскольку мне не хотелось заморачиваться с установкой софта на виртуальную машину, я развернул mingw у себя под «Маком» и внёс правки, чтобы всё благополучно компилировалось именно на этой ОС.
Запустив получившееся на первой попавшейся виндовой виртуалке, я успокоился. Но оказалось этого недостаточно — под самой «Виндоуз» приложение не собиралось!
Во-первых, под «Виндой» отсутствовала функция strdup, интернет ничего не подсказал, но я случайно решил эту проблему, установив стандарт языка в GNU C++11: -std=gnu++11.
Во-вторых, почему отсутствовали-то ряд важных констант. Cледуя совету на «Стековерфлоу», я просто определил их нужными значениями.
В-третьих, функцию usleep пришлось заменить на Sleep из windows.h.
После этих правок игра начала собираться под «Виндой» тоже.
Недавно прочитал в одной из статей на Хабре, что «язык Си++ достаточно сложен, чтобы позволить нам писать на нём просто», как же это верно! Неожиданно много времени занимает борьба с какими-то вещами, которые, как мне кажется, должны просто работать.
Раз есть С++11, то для sleep имеет смысл использовать std::this_thread::sleep_for.
А так, конечно, кроссплатформенный с++ это боль, но все же в новых стандартах потихоньку стали развивать стандартную библиотеку и жить становится чуточку легче.
Я уже сейчас боюсь что-то менять — опять где-нибудь перестанет собираться ))
Кстати, я её пробовал использовать, но у меня не заработали всякие там 200ms и прочие, я не стал разбираться тогда, других проблем хватало )
Добавлено: попробовал заменить, собралось под «Маком», но под «Виндоуз» не собирается:
C++ ¯\_(ツ)_/¯
Ну да ))
в итоге сделал макрос SLEEP и две реализации — для mingw и нет. Если подвернётся какой-нибудь вариант, который будет работать везде, просто заменю макрос.
Странно, у меня всё прекрасно собралось под Windows по примеру с https://en.cppreference.com/w/cpp/thread/sleep_for
Вы случайно #include <thread> и using namespace std::chrono_literals; не забыли?
А чем собирали?
Microsoft Visual Studio 2019 Community 16.11.25
Ааа… ну там может быть и работает, я нам mingw ориентируюсь.
Implementation of standard C++11 threading classes, which are currently still missing on MinGW GCC — https://stackoverflow.com/a/37358960. Печально..
Да, я на это тоже натыкался.