【问题标题】:Linking a static library twice in iOS project [duplicate]在iOS项目中两次链接静态库[重复]
【发布时间】:2016-06-24 13:56:48
【问题描述】:

我有一个带有库依赖项的 iOS 项目(我们称之为 ma​​inProj)。该库也用于其他项目。我们称这个库为 utilLib

现在,我想在 ma​​inProjutilLib 中添加另一个库(我们称之为 logLib)作为依赖项。 p>

问题是在 ma​​inProjutilLib 中添加 logLib 作为依赖项会导致符号重复。另一个问题是 ma​​inProjutilLib 都需要依赖于该 logLib,因为它们需要彼此独立工作。 p>

这个问题有解决办法吗?

【问题讨论】:

    标签: ios objective-c build linker clang


    【解决方案1】:

    在我看来,最好的解决方案是将 logLib 仅添加到 utilLib。无论如何它都可以从 mainProj 获得,因为它已经依赖于 utilLib。

    【讨论】:

    • 但是,它将 utilLib 与 mainProj 耦合。如果 utilLib 稍后被删除,mainProj 将不再构建。
    【解决方案2】:

    您应该只将logLib 链接到mainProj。没有理由将其链接到utilLib。静态库只是一堆未链接的.o 文件。您永远不需要将依赖项链接到静态库中,并且您应该强烈避免这样做,因为它会导致重复的符号。您只需要 utilLiblogLib 标头。

    【讨论】:

    • 正如我所指定的,utilLib 也用于其他项目,它需要日志记录功能。我不想强迫 utilLib 的用户也依赖 logLib。
    • 没关系。 utilLib 仍然可以访问 logLib。其他项目也需要链接 utilLib 和 logLib。在编译 utilLib 时只需要 logLib 头文件。在最终的项目链接之前,您不需要将它们链接在一起(这是唯一一次您应该将它们链接在一起)。对于每个人都会问的下一个明显问题,“我如何让其他项目使用 utilLib 而不必自己链接 logLib?”答案是“你没有”。他们需要自己链接所有依赖项,否则最终会发生冲突。
    • 如果 utilLib 像 logLib 一样使用 100 个其他库怎么办?我是否应该强制使用 utilLib 的每个人也链接所有这 100 个库?这看起来不是一个好习惯。它应该只有一个库。此外,我无权访问使用 utilLib 的其他项目。事实上,我什至不知道有多少项目依赖它。
    • 是的,如果你有那么多依赖项,你必须让每个人都链接它们。您不应该创建具有如此多依赖项的库。您为解决此问题而尝试做的任何事情最终都会导致冲突。您不能为调用者预先链接他们可能从其他地方链接的任何库。即使它看起来有效,非常小的变化也会使它爆炸。这很不方便,但如果没有包管理器(它只会在最后自动链接所有内容;它不会避免它),这不是一个可解决的问题。
    • +1 用于依赖倒置,尤其是日志记录。调用者将自己的记录器传递给框架比让框架自己记录日志要好得多。这是一个很好的探索方向。
    猜你喜欢
    • 2015-09-21
    • 2012-12-24
    • 2019-03-13
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多