【问题标题】:How do I solve class name conflicts when creating an iOS framework?创建 iOS 框架时如何解决类名冲突?
【发布时间】:2014-08-07 13:52:04
【问题描述】:

我正在编写一个依赖于静态第三方库 Lib 的 iOS 框架 Foo,但在正确链接时遇到问题。

如果Foo 是一个静态库,我会将它与Lib 链接,并且只将主项目与它们两者链接。但这种方法似乎不适用于框架:链接器抱怨缺少来自 Lib 的符号。

所以我采用了另一种方法并将FooLib 联系起来。现在链接器很高兴,但有一个明显的问题:如果主项目出于自身原因使用Lib 并同时链接FooLib,我会得到重复的符号:

Class <Something> is implemented in both <Here> and <There>.
One of the two will be used. Which one is undefined.

我知道我可以停止将应用程序与 Lib 关联,一切都会好起来的,但我想把事情做好。怎么样?

【问题讨论】:

  • 这是一个动态框架吗? (现在才将其支持引入 iOS AFAIK)。
  • 这是 Apple 在 OS X 上所谓的“私有框架”。捆绑在应用程序包中的框架,不链接到其二进制文件。这可能意味着是的,它是一个动态框架。 (这里是question about the status of these frameworks on iOS。)
  • 如果是这种情况,那么 1) 您需要检查对您想要支持的 iOS 版本的支持(要知道仅支持静态框架,这些框架是具有相关资源的美化静态库)。 2) 重复符号没有意义,因为二进制文件是完全独立的(想想 .exe 和 .dll)。
  • 哦,这是运行时抱怨,而不是链接器。对我来说应该很明显,我只在运行时收到警告。我将编辑问题。
  • 啊,我以前见过,它让我脊背发凉(因为它看起来很阴险)。但是我不记得解决方案是什么:)

标签: ios xcode frameworks linker


【解决方案1】:

我能够让这个框架工作,尽管文档说它也应该适用于静态库。

我所做的是将主项目与FooLib 联系起来,就像你说的那样。现在Foo 出现“缺少符号”错误。选择Foo 目标并转到其他链接器标志。添加-weak_framework Lib 就可以了!链接器将停止抱怨。重复的符号运行时错误消失了。

根据docs

-weak_framework 选项告诉链接器弱链接命名框架中的所有符号。如果需要链接到库而不是框架,可以使用-weak_library 链接器命令代替

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2014-01-22
    • 2011-04-17
    • 2015-04-12
    相关资源
    最近更新 更多