mingw32 и mingw64 - как отличить в какой среде оно запущено ? Вариантов минимум два, или на Linux, или на Windows.
Определять надо в коде, скрипты и прочие внешние средства не подходят.
Пробовал смотреть на __STDC__, __STDC_VERSION__ вроде есть в обеих случаях с -std=gnu99, была надежда что версии разные, но нет, одинаковые.
Всякие системные, типа __linux они естественно убраны.
Проверял как кодом, так и:
i686-w64-mingw32-gcc -dM -E - < /dev/null
Задача отличить кросс компиляцию от нативной. Связано с различной декларацией функций в этих случаях.
Упрощенный пример, есть:
#if defined(__MINGW32__)
int vswprintf(wchar_t*, const wchar_t*, va_list);
#endif
хочется:
#if (defined(__MINGW32__) && !defined(__CROSS_COMPILE_TIME__))
int vswprintf(wchar_t*, const wchar_t*, va_list);
#endif
Непонятен вопрос, как может быть экзешник запущен в Linux. А Linux-бинарник без libstdc++.o. Если не в лом компилируй с define под что. Я в винде не компайлил, но вдруг это есть. Попробуй функцию uname:
#include <sys/utsname.h>
struct utsname buf;
if( ! uname( & buf)) strcmp(buf.sysname,"Linux" )
В результате поисков решения перешел от дефайнов компилятора к системе сборки, как и советовал @Fat-Zer.
Но там тоже оказалось не без подводных камней, mingw64-cmake полностью симулирует платформу Windows, и про то что оно заводиться из под Linux узнать из переменных Cmake невозможно.
Нашел вероятно не самый прямой путь, но вроде работает, может пригодиться кому:
CMakeLists.txt
find_program(BUILD_OS_NAME
uname
/bin
/usr/bin
/usr/local/bin
/sbin
)
mark_as_advanced(
BUILD_OS_NAME
)
......
if(${BUILD_OS_NAME} STREQUAL "BUILD_OS_NAME-NOTFOUND")
message("-- No cross-compile mode")
else()
message("-- Cross-compile UNIX platform to Win")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__CROSS_COMPILE_TIME__")
endif()
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости