libz.dylib与libz.1.2.3.dylib与libz.1.2.5.dylib的对比

我在评论中提出这个问题,但这似乎是一个值得自己质疑的问题。

我有一个在三个不同的XCode安装和两个不同的iOS SDK安装之间共享的项目。 目前统一所涉及的开发人员不是一种select。

当我安装iOS 5 Beta和XCode 4.2时, libz.1.2.3.dylib无处可寻。 我发现,链接到libz.1.2.5.dylib处理这个,但这是不兼容的XCode和iOS SDK的其他活动安装。

我在网上进行了研究,发现了上面的build议和这个build议。 前者不适合我,后者让我感到紧张。

那么libz.dyliblibz.1.2.3.dyliblibz.1.2.5.dylib之间有什么区别,我可以安全地链接到所有XCode和iOS SDK的安装?

操作系统通常包含许多dynamic库的版本。 这些被不同的程序使用,这取决于它们在编译时编译的是哪个库,但是当你编译的时候,你想链接到你正在包含/导入到你的源代码中的已安装的头文件对应的版本。

libz.dylib将链接到您安装的标头使用的相同版本。

假设你有两个版本的libXYZ.1.dyliblibXYZ.2.dyliblibXYZ.dylib是一个libXYZ.dylib的链接,而libXYZ.1.dylib是一个传统的lib,在编译的应用程序在libXYZ.2.dylib发布之前libXYZ.2.dyliblibXYZ.1.dylib已包含在SDK中,因为可能有旧的框架仍然希望与旧版本链接。

这两个版本在头文件中可能有非常相似的接口,所以在编译和运行时你不会看到任何真正的差异,但是在将来的版本中,旧版本可能会被删除,并且新增加了新的版本,这将使你的项目在链接时断开。

如果我理解正确的话,链接器将取消引用文件链接,以便find正确的版本并保持该dylib名称,并在应用程序启动时dynamic链接。 所以libz.dylib将不会是使用的path(在编译时多)。

我在4.3 SDK的Xcode安装中看到了这一点

/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中,“Show in Finder”是其中一个库。 现在点击一下libz.dylib和“Get Info”。 你会看到“原始”是:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/libz.1.2.5.dylib (从iOS 5 SDK开始,XCode4.2起)

所以这是目前版本1.2.5的一个符号链接。 将来它会更新到最新的1.xx你可以这样检查所有的各种版本。

只需链接libz.dylib而不是特定的版本,编译器将链接已安装SDK上的可用版本。 链接器错误可能会在与当前安装的SDK中不可用的某些特定版本链接的情况下发生。

你可以使用libz.1.2.5.dylib而不是libz.1.2.3.dylib

replacelibz.1.2.3.dylib —–> libz.1.2.5.dylib