【问题标题】:iPhone -- nest libraries in a project without linker errors?iPhone——在没有链接器错误的项目中嵌套库?
【发布时间】:2011-08-22 03:46:41
【问题描述】:

这快把我逼疯了。

我有库 A,而库 A 又包含库 B。嵌套的库对用于 5 个不同的项目。我想将 A 和 B 的源代码放在一个地方,并将所有 5 个项目链接到它们。

无论我做什么,都会遇到以下两种错误之一:

1) 类库 B 与自身发生冲突。链接器在库 A 和库 B 中都可以看到该类。

2) 缺少某些类,因为链接器找不到它们。

我应该提到图书馆 A 包括类别。我通过在每个类别文件中有一个虚拟类并在外部项目中使用 ObjC 链接器标志来处理类别错误。

这是我尝试使用的设置。如下所述,我得到了重复的符号。

我有目录 Documents/LibraryA、Documents/LibraryA/LibraryB 和 Documents/Project1 到 Documents/Project5。

目录 Documents/Project1 有一个符号链接 LibraryA,它指向 ../LibraryA。项目 2 到 5 也是如此。

包含项目中的标题搜索路径是 ./LibraryA ./LibraryA/Classes/** 和 ./LibraryA/LibraryB/**

LibraryA 中的标头搜索路径为 ./LibraryB/**

库搜索路径始终为空。

【问题讨论】:

    标签: iphone xcode ios4 linker static-libraries


    【解决方案1】:

    随着复杂性/共享的增加,当库被大量重用时,您意识到静态链接(同时保持理智)的方法是将链接过程(公开重用的图像)保存到最终可执行文件的链接阶段。

    因此,静态库仅链接到私有内部库(通常不会在较小的代码库中找到),而最终可执行文件链接到每个公开可见的库(及其依赖项)。

    这当然会在链接最终可执行文件时暴露依赖关系。

    如果可以对库进行分组,您也可以将它们合并到一个库中以创建一个元库,前提是您确保元库的子库在它链接到的所有可执行文件的其他阶段永远不会链接。

    【讨论】:

    • 如何在 iPhone 上拥有私有内部库?我认为主项目总是必须链接到每个库,甚至是子库。
    • 您可以通过将静态库目标链接到另一个静态库目标来完成它。在这种情况下,库被合并。这通常只发生在大型或复杂的库和/或代码库中,但在其他情况下可能很有用。当图书馆变得非常大或重要部分最好为了组织目的而划分时,我通常会这样做。除了更小、更易于管理的项目之外,您还可以减少链接和构建时间。
    • 哇,我可以投票一百万次吗?我一直认为顶级项目必须直接链接到子库,方法是将它们包含在“将二进制文件与库链接”构建步骤中。显然情况并非如此。我不知道这是否是 Apple 的改进,或者我是否一直错过了这条船。无论哪种情况,一百万谢谢。
    • 不客气。多年来一直可以像这样链接(不确定有多少)。这就是静态链接的工作原理——在 Xcode 项目中看到这种策略并不太常见,或者从 ide 中可以明显看出静态图像在链接时可能会被合并。正如您现在可能已经发现的那样,它有助于为静态库集合定义一组通用的构建设置,因此您可以保持所有构建和链接设置相同。最后,使用静态库很容易维护复杂的依赖关系——在某些方面比 dylib 简单得多。干杯。
    • @justin 你能举例说明你的意思吗?如果你有一个很棒的 github 存储库。或者去这里回答我的问题,我会给你500分赏金:stackoverflow.com/questions/13264847/…
    【解决方案2】:

    【讨论】:

    • 没有。我读过其他开发人员在尝试这样做时遇到了问题。但我自己没有试过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多