Подтвердить что ты не робот

Что подразумевается в macosx-version-min?

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

4b9b3361

Ответ 1

Этот параметр будет использоваться различными макросами доступности, размещенными в заголовках. Это означает, что вы можете потребовать минимальную версию ОС, даже если у вас более свежий 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/32bits, PowerPC/32bits, Intel/64bits, PowerPC 64bits), а с 10,6 SDK вы можете использовать только три архитектуры (Intel/32bits, PowerPC/32bits, Intel/64бит).

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

gcc -arch i386

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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