gmtime_s - это изначально была нестандартная функция, придуманная Microsoft (хотя и полезная). Ее и прочие "safe"-функции от MS стандартизировали в C11, но отдельным пакетом - Annex K - и как необязательные к реализации. См. на той странице, что вы указали:
As with all bounds-checked functions, gmtime_s only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including .
gcc/glibc и clang/libc не определяют __STDC_LIB_EXT1__ и не поддерживают эти функции.
Также есть функция gmtime_r, которая решает ту же проблему, что и gmtime_s - она гарантированно будет в реализации стандартной библиотеки, но только в C23, т.е. в распоследних версиях компиляторов, которые эту версию поддерживают. Или _может быть_ как расширение - к примеру, на gcc она доступна при наличии макроса __USE_POSIX.
Отвечая на вопрос - не используйте gmtime_s, если хотите хорошую портабельность кода. Либо
- использовать свежайшее всё, C23 и gmtime_r,
- либо прагматичный, но несовсемпортабельный подход - впиливать в cmake и код выбор - на msvc библиотеке использовать gmtime_s, на libc/glibc - __USE_POSIX и gmtime_r
- либо, раз уж вы используете C++, то еще можно подвинуться на C++20 и C++-ные year_month_day и hh_mm_ss.
Похожая история с mbstowcs_s - тот же Annex K и нереализованность на других библиотеках. Используйте mbsrtowcs и иже с ним.