Ответ 1
ОС часто включает в себя множество версий динамических библиотек. Они используются различными программами в зависимости от того, с какой библиотекой они были скомпилированы в момент компиляции, но когда вы компилируете, вы хотите связать с версией, которая соответствует установленным заголовкам, которые вы включаете/импортируете в свой исходный код.
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