具有库依赖性但没有嵌入的Objective C框架

时间:2014-07-21 22:36:07

标签: objective-c macos cocoa

我正在编写一个框架Stuff.framework(供私人使用),它依赖于第三方静态库libthirdparty.a,但我不想在框架中嵌入库。该框架将由SomeApp.app(以及其他)使用。

为了简单起见,我们假设我们同意嵌入不好。

如果我正在编写库libstuff.a而不是框架,我就不会将libstuff.a与libthirdparty.a链接起来。 SomeApp.app会链接到libstuff.a和libthirdparty.a - 没问题。

这种方法不适用于框架。如果Stuff.framework没有链接libthirdparty.a,则链接器会给出“未定义的符号”错误。如果Stuff.framework确实链接了libthirdparty.a,那么库的内容将嵌入到框架中,这是我想要避免的。

那么,有没有人知道如何实现第一段所述的目标?我想这是静态库和动态库之间的区别,但也许有可以解决它的链接选项。

1 个答案:

答案 0 :(得分:0)

动态链接救援!

静态链接静态库中的一段代码的框架将尽可能调用该静态库的代码,而不会污染您的符号空间。即使将同一静态库的多个副本链接到多个框架中,或者甚至当一个框架链接到应用程序本身也链接到的静态库的副本时,仍然有两个符号副本。其中一个副本是您的应用程序的本地副本,将被调用,另一个是框架的本地副本,它将调用它。所以,放松一下。链接器为您处理所有必需品。

一般来说,你是对的,嵌入很糟糕,但现在只适用于你的恐惧完全合理的静态库。在这种情况下,链接器将具有重复的符号,以从库的多个副本集成到二进制文件中。它可能只是选择它看到的第一个并继续前进,或者它可能会发出重复的符号警告。无论哪种方式,都不好。