Что означает macosx-version-min?

Когда я передаю флаг компилятора -mmacosx-version-min=10.5, что это значит? Я думаю, что это означает, что в результате получается двоичный файл x86, а не ppc, но 32-битный или 64-битный? Я компилирую на снежном барсе, поэтому двоичный файл по умолчанию равен 64 битам. Я не прохожу -universalЯ думаю, это не 32-битный универсальный двоичный файл.

4 ответа

Решение

Эта опция будет использоваться различными макросами доступности, помещенными в заголовки. Это означает, что вам может потребоваться минимальная версия ОС, даже если у вас более поздняя версия SDK (то есть цель 10,5 с 10,6 SDK). Использование API 10.6 при нацеливании на 10.5 вызовет предупреждение, и API будет связан с атрибутом weak_import.

Большинство заголовков API Apple содержат макросы доступности для каждого класса, методов, функций или перечислений, чтобы объявить для каждого из них:

  • Минимальная поддерживаемая ОС
  • Амортизация
  • Недоступность
  • ...

Макросы выглядят так:

  • AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER
  • AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED
  • ...

Что касается архитектуры, то она зависит только от доступных архитектур в двоичных файлах SDK. Например, с 10.5 SDK вы можете использовать четыре архитектуры (Intel/32bit, PowerPC/32bit, Intel/64bit, PowerPC 64bit), в то время как с 10.6 SDK вы можете использовать только три архитектуры (Intel/32bit, PowerPC/32bit, Intel / 64бит).

Поскольку вы используете Snow Leopard, вы можете очень просто выбрать i386 (Intel/32bit), ppc (PowerPC/32bit) или x86_64 (Intel/64bit), передав параметр архитектуры, подобный следующему:

gcc -arch i386

или как это (для проектов на основе конфигурации):

CFLAGS="-arch i386" LDFLAGS="-arch i386" ./configure

-mmacosx-version-min=... также влияет на выбор по умолчанию реализации C++ STL (GNU или LLVM), и в этом отношении он одинаково важен для компилятора и компоновщика.

Из моего тестирования также важно, чтобы эта опция была передана на шаг ссылки (например, -arch); так что это влияет не только на макросы / предварительную обработку (что может быть выведено из других ответов).

Когда он был передан на шаг компиляции, но не передан на шаг компоновки, я обнаружил, что разделяемые библиотеки, созданные с 10.6, не будут загружаться под 10.5.

Это вызывает предупреждения компилятора для методов, которые появились после Mac OS X 10.5. Это не имеет ничего общего с архитектурой.

Другие вопросы по тегам