Как я могу встроить XCode 4 для цели развертывания iOS 3.1, используя libSystem.B? - PullRequest
5 голосов
/ 18 марта 2011

Я недавно обновил XCode 3 до 4, и теперь у меня проблемы со сборкой в ​​моем проекте iPhone.Мне нужно поддерживать более старые версии iOS до 3.1.С XCode 3.2.5 у меня не было проблем с сборкой SDK 4.2 с использованием цели развертывания iOS 3.1.Я также добавил слабую ссылку на библиотеку libSystem.B, которая требуется для запуска приложения на старых версиях iOS.Теперь, когда я строю с XCode 4, я получаю ошибку компоновщика ниже.Шаг компиляции завершен, но шаг ссылки завершается неудачно.Если я удаляю слабую ссылку на библиотеку libSystem.B, то сборка завершается, но приложение запускается при запуске на iOS 3.1.

Кто-нибудь нашел решение этой проблемы?Как вы строите с XCode 4, чтобы работать на старой версии iOS?

ld: library not found for -lSystem.B collect2: ld returned 1 exit status Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 failed with exit code 1

Ответы [ 4 ]

6 голосов
/ 25 марта 2011

В настройках сборки вашего проекта в разделе «Другие флаги компоновщика» добавьте следующее:

-weak_library /usr/lib/libSystem.B.dylib

Он должен автоматически добавляться к настройкам сборки Target, но если это не так, вы также должны добавить его туда.

4 голосов
/ 27 июля 2012

ОК, опция weak_library - верный путь ... вот проблемы:

.B обозначает вторую версию системной библиотеки. Я предполагаю, что некоторые новые функции Obj-C требуют этого (например, блоки), и использование библиотек, которые предоставляют поддержку API для блоков, и косвенно ссылается на системную библиотеку .B. Это означает, что динамический компоновщик будет пытаться использовать libSystem.B, но косвенно (если ваш код не использует эти функции).

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

Чтобы запустить его на старых телефонах, вам нужно указать слабую связь для libSystem.B. Слабая ссылка в основном делает его таким, чтобы старые библиотеки, в которых отсутствуют биты, не вызывали проблем. При нормальной связи динамический компоновщик необходим для нахождения всех символов, которые когда-либо могут быть использованы. При слабой связи компоновщик учитывает недостающие элементы. Это часть поддержки Apple для старых телефонов ... если в библиотеке отсутствует символ, не беспокойтесь об этом.

К сожалению, SDK для симулятора 5.1 НЕ включает файл libSystem.B.dylib, поэтому некоторые из вышеперечисленных решений вроде как работают ... если вы поместите файл в него, то сможете его найти, он по крайней мере выиграл ' умереть при сборке.

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

Использование /usr/lib/libSystem.B - плохая идея, поскольку это библиотека OSX, а не iOS. Точно так же, соединение с библиотекой DEVICE даст вам библиотеку с arm arch, которая не будет работать в симе, работающем на оборудовании Intel.

Использование libSystem.B из более старого SDK является лучшей идеей и, вероятно, будет работать, но, учитывая, что похоже, что Apple не следует своему собственному совету с версионированием библиотек (похоже, что в 5.1 они снова отказались от версии) Я бы предположил, что это также вызовет проблемы.

Итак, если вы хотите поддерживать более старые устройства и хотите, чтобы сим работал правильно, похоже, что лучший подход заключается в следующем:

  1. Добавьте libSystem.B.dylib к соединению с библиотеками на этапах сборки как ДОПОЛНИТЕЛЬНЫЙ (это эквивалентно добавлению флага другого компоновщика -weak_library, но находит для вас правильный файл).
  2. Создайте ссылку sym из libSystem.dylib в платформе iOS SIMULATOR на libSystem.B.

Мое рассуждение состоит в том, что, так как .B указывает на повышение версий, и поскольку ios5.x будет иметь все необходимые функции в стандартной библиотеке, должно быть в порядке, что версия .B идентична не версионная библиотека. В XCode 4.4 (июль 2012 г.) это делается с помощью:

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/usr/lib
sudo ln -s libSystem.dylib libSystem.B.dylib

Действительно, вероятно, безопасно использовать что-либо, похожее на действительную библиотеку, просто потому, что на самом деле работает в ios 5.x, в настоящее время он даже не ищет B-версию .... Обходной путь - пройти ссылку фаза для старых устройств ... тем не менее, похоже, что это исправление безопаснее, чем другие альтернативы, перечисленные выше.

Некоторые перекрестные ссылки по интересам:

Слабое связывание в каркасах

Инструменты разработчика Слабое связывание

3 голосов
/ 01 июля 2011

Вот мое решение для Xcode 4.0.2 со средой SDK 4.3, но я считаю, что оно должно работать и для других настроек.

  1. libSystem.B.dylib нет под /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/lib, однако он присутствует для более низкого SDK версии (например, iPhoneOS4.2.sdk)
  2. большинство случаев libSystem.B.dylib это просто символическая ссылка на libSystem.dylib
  3. так в iPhoneSimulator4.3.sdk/usr/lib Я применил следующую команду sudo ln -s libSystem.dylib libSystem.B.dylib и мой симулятор билды снова начали работать :)

ПРИМЕЧАНИЕ: libSystem.B.dylib используется Flurry и Urban Airship, поэтому лучше не удалять ссылку в файле проекта (конечно, Urban Airship не работает под симулятором, но я думаю, что Flurry работает. libSystem.B.dylib может также потребоваться другим библиотекам, включенным в ваш проект.

0 голосов
/ 27 июня 2011

Вот мое пошаговое решение:

  1. Я скопировал файл libSystem.B.dylib из MAC моего друга (/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk / USR / Lib / libSystem.B.dylib).!!!xCode 3.2.5 был установлен на его MAC с 4.0 и 4.2 SDK.!!!
  2. Перейдите: ProjectSettings> Targets> BuildPhases> Link Binary With Libraries> '+'.
  3. 'Добавить другое'.Выберите скопированный файл libSystem.B.dylib (его можно найти в комплекте проекта)
  4. Build ...

После этого я не получил 'библиотека не найдена для -Ошибка lSystem.B '.

Также приложение запускает файл на устройствах с iOS <4. </p>

Это очень странно, но кажется, что проблема в собственном файле libSystem.B.dylib,Родной - я имею в виду xCode 4.0.2.

Удачи.

...