libz.dylib与libz.1.2.3.dylib与libz.1.2.5.dylib的区别是什么?

34

我在评论中提到了这个问题,但这个问题似乎值得有自己的问题。

我有一个项目,在三个不同的XCode安装和两个不同的iOS SDK安装之间共享。 目前统一参与开发的人员不是一个选项。

当我安装iOS 5 Beta和XCode 4.2时,libz.1.2.3.dylib 没有出现在任何地方。 我发现链接到 libz.1.2.5.dylib 可以解决此问题,但这与其他活动的XCode和iOS SDK安装不兼容。

我在网上研究了这个问题,并发现了上面的建议和这个 建议。 前者对我不起作用,后者让我感到紧张。

那么,libz.dyliblibz.1.2.3.dyliblibz.1.2.5.dylib有什么区别,并且我可以安全地在所有XCode和iOS SDK安装中链接到第一个吗?

4个回答

28
操作系统通常包含许多版本的动态库。这些库根据它们在编译时所编译的库的不同,由不同的程序使用,但是当您进行编译时,您希望链接到与您在源代码中包含/导入的已安装头文件相对应的版本。 libz.dylib将链接到与您已安装的头文件使用的相同版本。
假设您有两个版本的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

的翻译是:libz.dylib。
/Developer/.../SDKs/iPhoneOS4.3.sdk/usr/lib/libz.dylib -> libz.1.2.3.dylib

6
您的意思是,如果我链接到libz.dylib,路径会在链接时动态更改为库的最新版本? - Hyperbole

4
你可以在Finder中轻松查看它们的工作方式。在XCode中,“在Finder中显示”一个库。现在单击一次libz.dylib并“获取信息”。您将看到“原始”的内容是:
/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.x.x版本。你可以用这种方式检查所有不同的版本。

3

只需链接到 libz.dylib,而不是特定的版本,编译器将链接已安装 SDK 上可用的版本。如果链接某些当前安装的 SDK 中没有的特定版本,则可能会出现链接器错误。


这似乎是迄今为止最好的答案! - Fattie

0

您可以使用libz.1.2.5.dylib代替libz.1.2.3.dylib

将libz.1.2.3.dylib替换为libz.1.2.5.dylib


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接