Пишу, по большей части, про историю, свою жизнь и немного про программирование.

«Гопник-2»: разные mingw

Надо по-быстрому дописать посты про портирования игры на «Виндоуз», пока свежо в памяти. Так что продолжу.

Сильнее всего меня удивило в процессе, что поведение mingw, — инструментария для компиляции приложений под «Виндоуз», различается под разными операционными системами.

Поскольку мне не хотелось заморачиваться с установкой софта на виртуальную машину, я развернул mingw у себя под «Маком» и внёс правки, чтобы всё благополучно компилировалось именно на этой ОС.

Запустив получившееся на первой попавшейся виндовой виртуалке, я успокоился. Но оказалось этого недостаточно — под самой «Виндоуз» приложение не собиралось!

Во-первых, под «Виндой» отсутствовала функция strdup, интернет ничего не подсказал, но я случайно решил эту проблему, установив стандарт языка в GNU C++11: -std=gnu++11.

Во-вторых, почему отсутствовали-то ряд важных констант. Cледуя совету на «Стековерфлоу», я просто определил их нужными значениями.

В-третьих, функцию usleep пришлось заменить на Sleep из windows.h.

После этих правок игра начала собираться под «Виндой» тоже.

Недавно прочитал в одной из статей на Хабре, что «язык Си++ достаточно сложен, чтобы позволить нам писать на нём просто», как же это верно! Неожиданно много времени занимает борьба с какими-то вещами, которые, как мне кажется, должны просто работать.

5 комментариев
Кирилл 1 год

Раз есть С++11, то для sleep имеет смысл использовать std::this_thread::sleep_for.
А так, конечно, кроссплатформенный с++ это боль, но все же в новых стандартах потихоньку стали развивать стандартную библиотеку и жить становится чуточку легче.

Евгений Степанищев 1 год

Я уже сейчас боюсь что-то менять — опять где-нибудь перестанет собираться ))

Кстати, я её пробовал использовать, но у меня не заработали всякие там 200ms и прочие, я не стал разбираться тогда, других проблем хватало )

Добавлено: попробовал заменить, собралось под «Маком», но под «Виндоуз» не собирается:

comm/cstat.cpp: In function ’void show_timer(time_t)’:
comm/cstat.cpp:34:18: error: ’std::this_thread’ has not been declared
std::this_thread::sleep_for(std::chrono::milliseconds(100));
^~~~~~~~~~~
make.exe: *** [comm/cstat.o] Error 1

Кирилл 1 год

под «Виндоуз» не собирается

C++ ¯\_(ツ)_/¯

Евгений Степанищев 1 год

Ну да ))

в итоге сделал макрос SLEEP и две реализации — для mingw и нет. Если подвернётся какой-нибудь вариант, который будет работать везде, просто заменю макрос.

bairog 1 год

Странно, у меня всё прекрасно собралось под Windows по примеру с https://en.cppreference.com/w/cpp/thread/sleep_for
Вы случайно #include <thread> и using namespace std::chrono_literals; не забыли?

Евгений Степанищев 1 год

А чем собирали?

bairog 1 год

Microsoft Visual Studio 2019 Community 16.11.25

Евгений Степанищев 1 год

Ааа… ну там может быть и работает, я нам mingw ориентируюсь.

bairog 1 год

Implementation of standard C++11 threading classes, which are currently still missing on MinGW GCC — https://stackoverflow.com/a/37358960. Печально..

Евгений Степанищев 1 год

Да, я на это тоже натыкался.