Xcode: условные настройки сборки на основе архитектуры (устройство (ARM) и симулятор (i386)) - PullRequest
24 голосов
/ 31 июля 2009

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

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

РЕДАКТИРОВАТЬ, март 2016 г. : этот вопрос был задан в июле 2009 г., почти 6 лет назад. С тех пор многое изменилось в Xcode, но, думаю, кое-что еще сохранилось. Например, принятый сейчас ответ не был предложен в Xcode v3.

Ответы [ 7 ]

28 голосов
/ 27 октября 2011

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

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

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

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

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

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

Эта страница StackOverflow объясняет новый способ установки параметров условной сборки в Xcode 4. Совет: Текстовые поля на вкладке «Настройки сборки» включены с помощью перетаскивания; как только у вас есть готовая настройка условной сборки для редактирования в разделе Другие флаги компоновщика, вы можете просто перетащить файл статической библиотеки прямо в текстовое поле, и XCode автоматически введет (надеюсь, относительный) путь.

Вот скриншот моих других флагов компоновщика, когда я получил предупреждение «отсутствует требуемая архитектура i386», чтобы пропустить без ошибок сборки:

enter image description here __

9 голосов
/ 31 июля 2009

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

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

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

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

5 голосов
/ 03 июня 2013

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

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

Чтобы исправить это, удалите эти записи из «Связать двоичные файлы с библиотеками», а затем следуйте приведенному выше руководству по настройке условного здания для sim / устройства »

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

3 голосов
/ 31 июля 2009

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

Для отладки:

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

Для выпуска

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

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

1 голос
/ 22 апреля 2010

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

1 голос
/ 30 января 2010

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

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

0 голосов
/ 09 июля 2010

В моем XCode 3.2.3 правильное имя выглядит как OTHER_LDFLAGS, а не OTHER_LINKER_FLAGS.

...