libz.dylib против libz.1.2.3.dylib против libz.1.2.5.dylib - PullRequest
34 голосов
/ 04 августа 2011

Я спросил об этом в комментарии, но это похоже на проблему, которая заслуживает отдельного вопроса.

У меня есть проект, который используется тремя разными установками 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 ]

28 голосов
/ 04 августа 2011

ОС часто включает в себя множество версий динамических библиотек. Они используются различными программами в зависимости от того, с какой библиотекой они были скомпилированы во время компиляции, но когда вы компилируете, вы хотите сделать ссылку на версию, которая соответствует установленным заголовкам, которые вы включаете / импортируете в свой исходный код.

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

/ Разработчик /.../ SDKs / iPhoneOS4.3.sdk / USR / включать / 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
4 голосов
/ 12 ноября 2011

Вы можете легко увидеть в видоискателе, как они работают.В 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 Вы можете проверить все различные версии таким образом.

3 голосов
/ 12 июня 2013

Просто свяжите с libz.dylib вместо конкретной версии, и компилятор свяжет доступную версию с установленным SDK.Ошибка компоновщика может возникнуть в случае связывания с какой-то конкретной версией, которая недоступна в установленном в настоящее время SDK.

0 голосов
/ 29 мая 2013

Вы можете использовать libz.1.2.5.dylib вместо libz.1.2.3.dylib

Заменить libz.1.2.3.dylib -----> libz.1.2.5.dylib

...