我在评论中提出这个问题,但这似乎是一个值得回答的问题。
我有一个项目,它在三个不同的XCode安装和两个不同的iOS SDK安装之间共享。目前,统一所涉及的开发人员不是一种选择。
当我安装iOS 5 Beta和XCode 4.2时libz.1.2.3.dylib
无处可寻。我发现与libz.1.2.5.dylib
的链接处理了这个,但这与XCode和iOS SDK的其他活动安装不兼容。
我在网上对此进行了研究,发现了上述建议和this建议。前者对我不起作用,后者让我紧张。
那么libz.dylib
,libz.1.2.3.dylib
和libz.1.2.5.dylib
之间的区别是什么?我可以安全地链接到XCode和iOS SDK的所有安装中的第一个吗?
答案 0 :(得分:28)
操作系统通常包含许多版本的动态库。这些由不同的程序使用,具体取决于它们在编译时编译的库,但是在编译时,您希望链接与您包含/导入到源代码中的已安装标头对应的版本。
libz.dylib
将是指向您安装的标头使用的相同版本的链接。
假设您有2个版本libXYZ.1.dylib
和libXYZ.2.dylib
,libXYZ.dylib
是指向libXYZ.2.dylib
的链接,而libXYZ.1.dylib
是一个旧版lib,也可以在在libXYZ.2.dylib
发布之前编译和分发的应用程序的操作系统。 libXYZ.1.dylib
已包含在SDK中,因为可能存在仍希望与旧版本链接的旧框架。
这两个版本的标题中可能有非常相似的接口,因此在编译和运行时您不会看到任何真正的差异,但在将来的版本中,旧版本可能会被删除并添加新版本会使您的项目中断联。
如果我理解正确,链接器将取消引用文件链接,以便它找到正确的版本并保留该dylib名称并在应用程序启动时动态链接。因此libz.dylib
将不是使用的路径(超过编译时)。
我在4.3 SDK中的Xcode安装中看到了这一点
/* 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
/Developer/.../SDKs/iPhoneOS4.3.sdk/usr/lib/libz.dylib -> libz.1.2.3.dylib
答案 1 :(得分: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.您可以通过这种方式检查所有各种版本。
答案 2 :(得分:3)
只需链接 libz.dylib 而不是特定版本,编译器将链接已安装SDK上的可用版本。如果链接到当前安装的SDK中不可用的某些特定版本,则可能会出现链接器错误。
答案 3 :(得分:0)
您可以使用libz.1.2.5.dylib而不是libz.1.2.3.dylib
替换libz.1.2.3.dylib -----> libz.1.2.5.dylib