我在评论中提出了这个问题,但这似乎是一个值得自己提问的问题。
我有一个在三个不同的XCode安装和两个不同的iOS SDK安装之间共享的项目。目前,统一相关的开发人员并不是一种选择。
当我安装iOS 5测试版和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软件开发工具包的所有安装中安全地链接到第一个吗?
发布于 2011-08-04 05:14:55
操作系统通常包含许多版本的动态库。它们由不同的程序使用,这取决于它们在编译时针对哪个库进行编译,但在编译时,您希望链接到与您要包含/导入到源代码中的已安装头文件相对应的版本。
该libz.dylib将是一个链接,指向您的已安装标头所使用的同一版本。
假设你有两个版本libXYZ.1.dylib和libXYZ.2.dylib,libXYZ.dylib是到libXYZ.2.dylib的链接,libXYZ.1.dylib是一个遗留的库,在libXYZ.2.dylib发布之前编译和分发的应用程序也可以在操作系统中使用。libXYZ.1.dylib之所以包含在软件开发工具包中,是因为可能有一些旧的框架仍然希望链接到旧版本。
这两个版本在头文件中可能有非常相似的接口,所以当你编译和运行时,你看不到任何真正的区别,但在未来的版本中,旧版本可能会被删除,并添加新的版本,这将使你的项目在链接时中断。
如果我理解正确的话,链接器将取消引用文件链接,这样它就会找到正确的版本,并保留dylib名称,并在应用程序启动时动态链接。因此,libz.dylib将不是使用的路径(多于编译时的路径)。
我在4.3SDK的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 Adlerlibz.dylib
/Developer/.../SDKs/iPhoneOS4.3.sdk/usr/lib/libz.dylib -> libz.1.2.3.dylib发布于 2011-11-12 13:28:53
您可以很容易地在finder中看到它们是如何工作的。在XCode中,“在查找器中显示”的库之一。现在点击一下libz.dylib和“获取信息”。你会看到“原创”是:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/libz.1.2.5.dylib (从带有iOS 5SDK的XCode4.2开始)
所以现在它是到1.2.5版本的符号链接。在未来,它将更新到最新的1.x.x。您可以通过这种方式检查所有不同的版本。
发布于 2013-06-12 16:51:00
只需链接libz.dylib,而不是特定的版本,编译器将链接已安装的SDK上的可用版本。链接到当前安装的SDK中未提供的特定版本时,可能会出现链接器错误。
https://stackoverflow.com/questions/6932991
复制相似问题