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

Xcode: Условные настройки сборки на основе архитектуры (Device (ARM) vs Simulator (i386))

Я создаю приложение для iPhone, которое должно запускаться как на симуляторе, так и на устройстве. Однако я использую внешнюю скомпилированную библиотеку, которая имеет одну версию для симулятора и одну для устройства (другой процессор).

Как я могу это сделать? Я исхожу из Visual С++, поэтому я новичок в Xcode, и я не могу найти способ сделать это.

EDIT, март 2016 года: этот вопрос задавали в июле 2009 года почти 6 лет назад. С Xcode многое изменилось с тех пор, но я думаю, что некоторые вещи все еще сохраняются. Теперь принятый ответ, например, не был вариантом в Xcode v3.

4b9b3361

Ответ 1

У меня возникла эта проблема при интеграции библиотеки Adobe Omniture "AppMeasurement", которая в настоящее время скомпилирована для 3-х архитектур: libAppMeasurement-iOSSimulator.a, libAppMeasurement-iOSDevice.a и libAppMeasurement-iOSDevice-armv7.a.

В то время как другие ответы здесь в основном правильны, мне пришлось отправиться в другое место, чтобы по-настоящему понять, а затем устранить проблему.

Шаг 1. Понимание проблем

Этот сообщение в блоге отлично справляется с общей проблемой. Он дает инструкции от начала до конца для решения проблемы в Xcode 3. См. Ниже для Xcode 4.

Примечание. Вы можете попробовать пропустить бит, где он говорит, чтобы добавить статические библиотеки, а затем удалить их. В следующий раз, когда я это сделаю, я, вероятно, просто добавлю заголовочный файл (ы), а затем перейду непосредственно к редактированию других флагов компоновщика.

Шаг 2. Условные настройки сборки в Xcode 4

Эта страница fooobar.com/questions/221594/... объясняет новый способ установки условных настроек сборки в Xcode 4. Совет: Текстовые поля на вкладке "Параметры сборки" - перетаскивание с помощью drag-and-drop; как только у вас будет установлен условный порядок сборки, готовый для редактирования в разделе Другие флаги компоновщика, вы можете просто перетащить файл статической библиотеки прямо в текстовое поле, и Xcode автоматически войдет в путь (надеюсь, относительный).

Вот скриншот моих других флагов Linker, когда я получил предупреждение "Отсутствующая требуемая архитектура i386", чтобы уйти без ошибок сборки:

enter image description here __

Ответ 2

У вас есть 3 варианта:

  • Если вы нажмете на имя настройки сборки внутри окна Inspect Window (где вы можете изменить настройки компилятора и т.д.), это даст возможность условно настроить этот параметр. Просто перейдите к флагам компоновщика, которые вы хотите изменить, и определите их с помощью SDK, затем введите конкретную библиотеку для каждого SDK.

  • В качестве альтернативы вы можете взять библиотеку и установить ее по одному пути в каждом корневом каталоге SDK ( "/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/" и "/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/usr/lib" ). Поскольку используются пути поиска относительной библиотеки SDK, соответствующая версия будет втянута для сборки.

  • Вы можете объединить две библиотеки в одну жировую библиотеку. Это, вероятно, плохая идея, но если вы хотите сделать это, просмотрите manpage.

Ответ 3

Для кого-то появляется предупреждение, подобное "[lib_for_sim_or_device], не построенное для архитектуры...", предупреждение возникает при перетаскивании папки сторонней библиотеки в проект.

За сценой XCode автоматически добавляет файлы библиотеки в настройки "target setting → Build Phrases → Link Binary with Libraries", что приводит к связыванию с обеими библиотеками.

Чтобы исправить это, удалите эти записи из "Link Binary with Libraries", а затем следуйте приведенному выше руководству по условным настройкам здания для sim/device '

Надеюсь, это поможет!

Ответ 4

Рекомендуемый способ сделать это - не добавлять библиотеку в свой проект и цель, а вместо этого устанавливать флаги Other Linker Flags для включения отдельных прямых ссылок на библиотеку ссылок для каждой конфигурации.

Отладка:

  OTHER_LINKER_FLAGS = -l/Path/To/My/Debug/Library.dylib

Для выпуска

  OTHER_LINKER_FLAGS = -l/Path/To/My/Release/Library.dylib

Конечно, вы можете использовать ссылки на другие настройки сборки, чтобы сделать эти пути относительно чего-то долговечным, или использовать Дерево источников для внешнего дерева источников.

Ответ 5

Для варианта 1 (см. ответ Луи Гербарга) в Xcode 3.2.1 выберите "Другие флаги компоновщика", а затем выберите "Добавить условие настройки сборки" в раскрывающемся меню в левом нижнем углу окна настройки сборки. См. Ответ cdespinosa для синтаксиса "Другие флаги компоновщика" )

Или вы также можете "Добавить условие настройки сборки" в "Пути поиска библиотеки", если у вас есть библиотеки устройств/симуляторов в отдельных каталогах.

Ответ 6

Проблема с другими флагами компоновщика и добавлением библиотек контролирует порядок ссылок библиотек, которые могут быть важны. Кажется, что версия флагов компоновщика означает, что эти библиотеки будут первыми, поэтому, если вы управляете другими библиотеками в xcode, которые должны быть первыми, тогда вам придется отказаться от этого и перенести все на другие флаги компоновщика...! - P

Ответ 7

В моем XCode 3.2.3 правильное именование, похоже, равно OTHER_LDFLAGS, а не OTHER_LINKER_FLAGS.