mingw 32/64 - как отличить в какой среде оно запущено

186
30 октября 2018, 09:30

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
Answer 1

Непонятен вопрос, как может быть экзешник запущен в Linux. А Linux-бинарник без libstdc++.o. Если не в лом компилируй с define под что. Я в винде не компайлил, но вдруг это есть. Попробуй функцию uname:

#include <sys/utsname.h>
struct utsname buf;
if( ! uname( & buf))  strcmp(buf.sysname,"Linux" )
Answer 2

В результате поисков решения перешел от дефайнов компилятора к системе сборки, как и советовал @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()
READ ALSO
Как уменьшить вес сборки в CLion

Как уменьшить вес сборки в CLion

ЗдравстуйтеЕсть необходимость собрать проект весом не более 1 мб, но 1 класс в проекте весит около 13мб

143
определение кодировки по переданному char* через WinApi

определение кодировки по переданному char* через WinApi

Подскажите, можно ли через WinApi определить кодировку переданной строки char* ? Мне нужно по переданной строке сравнивать является и она Utf8 или...

140
Как установить библиотеку curl на mac? - c++

Как установить библиотеку curl на mac? - c++

Возможно ли вообще использовать эту библиотеку на mac и как это сделать?

148
SDL 2 задать 4 координаты для картинки

SDL 2 задать 4 координаты для картинки

Возник вопрос по SDL2нужно сделать так чтобы картинку я мог вставить по 4 координатам(для того чтобы растягивать изменять пропорциию картинки...

177