34

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

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

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

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

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

4

4 回答 4

28

操作系统通常包含许多版本的动态库。这些由不同的程序使用,具体取决于它们在编译时编译的库,但是当您编译时,您希望链接与您正在包含/导入到源代码中的已安装头文件相对应的版本。

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不会是使用的路径(超过编译时)。

我在 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
于 2011-08-03T21:14:54.937 回答
4

您可以在取景器中轻松查看它们的工作原理。在 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.xx 您可以通过这种方式检查所有各种版本。

于 2011-11-12T05:28:52.880 回答
3

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

于 2013-06-12T08:50:59.830 回答
0

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

替换 libz.1.2.3.dylib -----> libz.1.2.5.dylib

于 2013-05-29T13:20:09.893 回答