Что означает 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. Это не имеет ничего общего с архитектурой.