【问题标题】:Objective C framework with library dependency but no embedding具有库依赖但没有嵌入的 Objective C 框架
【发布时间】:2014-07-22 07:23:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您正在尝试请求动态绑定到静态库。这真的不会发生。库静态链接到框架有什么问题?此外,链接和“嵌入”是不同的概念。我不确定你所说的嵌入是什么意思。
  • 如果答案是“那是不可能的”,那很好——我不会再浪费时间了。我的理解是静态库的代码被复制到框架中。假设您有两个使用同一个库的框架,并且都被应用程序使用 - 现在您在应用程序中有重复的符号。更糟糕的是,如果框架使用不同版本的库怎么办?和/或应用程序本身也使用该库?很有可能,例如。如果他们都使用给定的日志库。
  • 这是 OS X,对吧?如果您发布了一个中间 dylib,您的应用程序将动态解析符号,这将调用 dylib 中的集成静态代码,而不必处理所有这些共享静态库的废话。

标签: objective-c macos cocoa


【解决方案1】:

动态链接救援!

从静态库中静态链接一段代码的框架将尽可能调用该静态库的代码,并且不会污染您的符号空间。即使同一静态库的多个副本链接到多个框架,或者即使一个框架链接到您的应用程序本身也链接到的静态库的副本,仍然存在两个符号副本。这些副本之一是您的应用程序本地的,将被调用,另一个是框架的本地,这就是它将调用的所有内容。所以,放松。链接器为您处理所有必需品。

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

【讨论】:

  • 使用动态库确实可以避免这个问题;不过那不是我问的,因为我坚持使用静态库是有原因的(Cocoapods,尽管我不想把它变成 Cocoapods 的讨论)。 (顺便说一句,不确定您在第二段中的意思-当您在某些地方表示“动态”时,您会说“静态”吗?)
  • Stuff.framework 是一个动态库。这就是整件事的重点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2022-01-22
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多