ios - libz.dylib 与 libz.1.2.3.dylib 与 libz.1.2.5.dylib

标签 ios xcode linker xcode4.2 libz

我在评论中提出了这个问题,但这似乎是一个值得单独提问的问题。

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

当我安装 iOS 5 Beta 和 XCode 4.2 时,找不到 libz.1.2.3.dylib。我发现链接到 libz.1.2.5.dylib 可以解决这个问题,但这与 XCode 和 iOS SDK 的其他事件安装不兼容。

我在线研究了这个并发现了上述建议和 this建议。前者对我不起作用,后者让我紧张。

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

最佳答案

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

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

假设你有 2 个版本 libXYZ.1.dyliblibXYZ.2.dyliblibXYZ.dylib 是一个链接到 libXYZ.2.dyliblibXYZ.1.dylib 是遗留库,在操作系统中也可用于在 libXYZ.2.dylib 已发布。 libXYZ.1.dylib 已包含在 SDK 中,因为可能有旧框架仍希望链接到旧版本。

这两个版本在头文件中可能有非常相似的接口(interface),因此您在编译和运行时不会看到任何真正的差异,但在未来的版本中,旧版本可能会被删除并添加新版本,这将使您的项目在以下情况下中断链接。

如果我理解正确,链接器将取消引用文件链接,以便找到正确的版本并保留该 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

关于ios - libz.dylib 与 libz.1.2.3.dylib 与 libz.1.2.5.dylib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932991/

相关文章:

ios - super 表达式必须为 null 或函数

ios - 使用self调用方法会导致错误

ios - 如何在 iOS 中确定位置源

windows - 了解 Windows 中正在运行的进程的布局(段)的任何工具?

c++ - g++/clang 覆盖特定函数的链接器

ios - 在 Xcode 6 中测试覆盖率文件

iphone - xCode 4.6 - 即使为应用程序启用状态栏也不会出现

ios - Xcode 单元测试构建失败,错误为 "Undefined symbols for architecture x86_64"

xcode - 使用 swift 为 Mac 应用程序获得管理权限

c++ - 如何调用具有多个不同签名的函数(如 glibc 调用 main)?