libz.dylib против libz.1.2.3.dylib против libz.1.2.5.dylib
Я спросил об этом в комментарии, но это похоже на проблему, которая заслуживает отдельного вопроса.
У меня есть проект, который разделен между тремя различными установками XCode и двумя различными установками iOS SDK. На данный момент объединение разработчиков не является возможным вариантом.
Когда я установил iOS 5 Beta и XCode 4.2 libz.1.2.3.dylib
нигде не было найдено. Я обнаружил, что связь с libz.1.2.5.dylib
обрабатывал это, но это не было совместимо с другими активными установками XCode и iOS SDK.
Я исследовал это онлайн и обнаружил вышеупомянутое предложение и это предложение. Первый не работает для меня, а второй заставляет меня нервничать.
Так какая разница между libz.dylib
, libz.1.2.3.dylib
а также libz.1.2.5.dylib
и можно ли безопасно подключиться к первому при всех установках XCode и iOS SDK?
4 ответа
ОС часто включает в себя множество версий динамических библиотек. Они используются различными программами в зависимости от того, с какой библиотекой они были скомпилированы во время их компиляции, но когда вы компилируете, вы хотите сделать ссылку на версию, которая соответствует установленным заголовкам, которые вы включаете / импортируете в свой исходный код.
libz.dylib
будет ссылкой на ту же версию, что и ваши установленные заголовки.
Скажем, у вас есть 2 версии libXYZ.1.dylib
а также libXYZ.2.dylib
, libXYZ.dylib
это ссылка на libXYZ.2.dylib
а также libXYZ.1.dylib
это устаревшая библиотека, которая также доступна в ОС для приложений, скомпилированных и распространенных ранее libXYZ.2.dylib
был выпущен. libXYZ.1.dylib
был включен в SDK, потому что могут быть старые фреймворки, которые все еще хотят быть связаны со старой версией.
Эти две версии могут иметь очень похожие интерфейсы в заголовке, так что вы не увидите никаких реальных отличий при компиляции и запуске, но в будущих версиях старые версии могут быть удалены и добавлены новые, что приведет к разрыву проекта при компоновке.
Если я правильно понимаю, компоновщик будет разыменовывать ссылки на файлы, чтобы найти правильную версию и сохранить это имя dylib и динамически связываться с ним при запуске приложения. Итак libz.dylib
не будет используемого пути (больше, чем во время компиляции).
Я вижу это в моей установке XCode в 4.3 SDK
/Developer/.../SDKs/iPhoneOS4.3.sdk/usr/include/zlib.h
/* zlib.h -- interface of the 'zlib' general purpose compression library
version 1.2.3, July 18th, 2005
Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
libz.dylib
/Developer/.../SDKs/iPhoneOS4.3.sdk/usr/lib/libz.dylib -> libz.1.2.3.dylib
Вы можете легко увидеть в поиске, как они работают. В XCode "Показать в Finder" одна из библиотек. Теперь нажмите один раз на libz.dylib и "Получить информацию". Вы увидите, что "Оригинал" это:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/libz.1.2.5.dylib
(начиная с XCode4.2 с iOS 5 SDK)
Так что пока это символическая ссылка на версию 1.2.5. В будущем он будет обновлен до последней версии 1.xx Вы можете проверить все различные версии таким образом.
Просто укажите ссылку на libz.dylib вместо конкретной версии, и компилятор свяжет доступную версию с установленным SDK. Ошибка компоновщика может возникнуть в случае связывания с какой-либо конкретной версией, которая недоступна в установленном в настоящее время SDK.
Вы можете использовать libz.1.2.5.dylib вместо libz.1.2.3.dylib
Замените libz.1.2.3.dylib -----> libz.1.2.5.dylib