ОК, опция 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 они снова отказались от версии) Я бы предположил, что это также вызовет проблемы.
Итак, если вы хотите поддерживать более старые устройства и хотите, чтобы сим работал правильно, похоже, что лучший подход заключается в следующем:
- Добавьте libSystem.B.dylib к соединению с библиотеками на этапах сборки как ДОПОЛНИТЕЛЬНЫЙ (это эквивалентно добавлению флага другого компоновщика -weak_library, но находит для вас правильный файл).
- Создайте ссылку 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-версию .... Обходной путь - пройти ссылку фаза для старых устройств ... тем не менее, похоже, что это исправление безопаснее, чем другие альтернативы, перечисленные выше.
Некоторые перекрестные ссылки по интересам:
Слабое связывание в каркасах
Инструменты разработчика Слабое связывание