从 iPhone/CocoaTouch 库中链接库的正确方法
Posted
技术标签:
【中文标题】从 iPhone/CocoaTouch 库中链接库的正确方法【英文标题】:Proper way to link against libraries from libraries for the iPhone/CocoaTouch 【发布时间】:2009-03-08 05:08:47 【问题描述】:我正在为 iPhone 编写一个静态库,我想知道我正在做的事情是否值得推荐,或者我是否应该采取不同的方法。
我正在编写的静态库依赖于 libxml2。 libxml2 有一个动态库(dylib)和一个静态库(a)。我尝试了两种方法。
方法一 - 当我尝试通过将“-lxml2”添加到“其他链接器标志”来链接静态库时,构建失败并显示以下消息:
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/libtool: file: -lxml2 is not an object file (not allowed in a library)
方法二 - 我可以从我的静态库中成功链接到动态库,但我不确定这在 iPhone 上是否允许(或正确的方法)。即使我正在构建一个静态库,Apple 是否允许链接到动态库的静态库?我仍在学习静态库,但据我了解,dylib 中的代码将与我的代码组合成一个库,因此链接到 dylib 应该不是问题。
总结一下:
mylibrary.a -> libxml2.a [不起作用] mylibrary.a -> libxml2.dylib [构建,但这是正确和可接受的吗?]【问题讨论】:
【参考方案1】:libxml2.dylib 在 SDK 中可用。 正确的方法是在Xcode中双击目标节点/应用程序,然后在General下点击“Linked Libraries”下的+...你应该会找到 libxml2.dylib 在该列表中。
0:42 在这个Screencast 中,您可以看到 CoreGraphics 是如何添加到项目中的。
【讨论】:
对。我了解 如何 链接。我的问题是它是从静态库链接到外部库的正确标准吗?不过,您提出了一个很好的观点,我有点忽略了这一点。 libxml2.dylib 与 SDK 一起分发,因此可能是允许的。 我建议不要链接 SDK 提供的动态库静态库。它们可以被其他框架使用,您可能会遇到版本问题,即 Foundation.framework 确实拉入 libxml2【参考方案2】:您不能将库静态链接到其他静态库。这就是为什么依赖于其他静态库的框架和库会要求消费者手动将它们添加到他们的 Link Binary With Libraries 构建阶段或 Other Linker Flags 构建设置中。
【讨论】:
【参考方案3】:Apple 不允许您链接除 SDK 提供的框架和/或库之外的框架和/或库。
马可
【讨论】:
其实,XCode 允许这样做就好了。不过,更抽象地说,*** 应该是一个可以快速轻松地找到正确答案的地方!如果您不知道或不确定,请不要发布作为答案。在 cmets 中提出澄清问题,或做一些研究,直到您确实知道正确答案! :)以上是关于从 iPhone/CocoaTouch 库中链接库的正确方法的主要内容,如果未能解决你的问题,请参考以下文章