1

我正在尝试在项目中使用静态库。静态库依赖于几个框架……CoreData、CFNetwork、AddressBook 等。

静态库也使用类别,所以我不得不在主项目的“其他链接器设置”中使用 -all_load 链接器选项。当我启用此功能时,我会收到 120 个错误,这些错误都与我的主项目没有与我的静态库(CoreData、CFNetwork、AddressBook 等)相同的框架链接。

开发人员想要使用静态库,链接到它,但仍然需要链接到库链接到的所有框架,这是非常不方便的。有没有办法自动化这个过程,以便主项目自动链接到静态库链接的所有框架?

我正在使用 XCode 4.4。

编辑:更清楚地说,我有以下内容:

StaticLibrary.xcodeproj
    - AFNetworking
        - files...
    - CoreData
        - categories for NSManagedObjectContext, for convenience
    - AddressBook
        - convenience methods for working with contacts

该项目的目标链接到 Build Phases > Link Binary With Libraries 下的必要框架。这包括 CoreData.framework、AddressBook.framework 等。

现在我想做的是将此库添加到我的另一个项目中。事实上,我想将这个库添加到我从这里开始制作的每个新项目中,所以我总是可以轻松访问我编写的便利函数/类别。所以:我将库添加到我的项目中,然后将.a文件添加到 Build Phases > Link Binary With Libraries(我的主项目的)。我还做了我所知道的所有其他必要的事情(见评论)。

我想要发生的事情:主项目现在链接到库,因此它继承了库的所有链接,因此主项目现在也链接到 CoreData.framework、AddressBook.framework 等。

会发生什么:主项目给了我错误,因为它没有链接到库需要的任何东西。

有没有办法自动将静态库中的链接框架添加到主项目中,或者我应该将库拆分为 CoreDataStaticLibrary 等,然后要求开发人员将 CoreData.framework 以及静态库添加到项目中每次都瞄准?

4

2 回答 2

1

据我了解,仅-all_load当您的库仅包含类别时才需要。否则,您可以使用-ObjC. 无论如何,这就是我使用的。

此外,当您构建静态库时,您只是在创建已编译对象模块的存档。库中没有解决外部依赖项。实际上,您应该将其视为一堆目标代码文件的单个集合。

因此,当您最终链接可执行文件时,它将链接您的所有编译代码,以及静态库中预编译代码的存档。链接器将期望解析所有符号,因此您必须告诉它在哪里可以找到完全解析所有符号所需的所有库(框架)。

XCode 是否应该能够查看静态库子项目内部并从该项目中提取框架依赖项并将它们添加到最终项目的链接器调用中?当然。但是,我不知道有一种方法可以自动实现这一点。

如果需要,您可以为您的库创建一个 podfile,并使用CocoaPods来管理您的项目依赖项。

于 2012-09-11T11:16:25.877 回答
0

问题是您多次包含相同的符号。我已经多次遇到相同的问题,解决方案基本上是了解“-all_load”标志的作用,这在这个 SO 问题中得到了很好的解释:What do the all load linked flag do

也就是说,您永远不会以这种方式从您的库中引用框架。由于这些框架是动态链接的,它们并不真正属于您的静态库,因此只有指向它们的引用。

此类库的用户应负责添加必要的框架以使其正常工作。这意味着,您不必将您的库链接到此类框架(因为这样的事情没有意义),只需将它们添加到将使用它的项目中即可。(看看 Restkit 看看它是如何完成的)。

另外,我认为您可以摆脱“all_load”标志并尝试将其替换为“force_load /path/to/the/library” all_load 仅在您的库仅包含类别(根本没有类)时才需要。

让我们知道进展如何,祝您编码愉快!

于 2012-09-11T14:56:29.037 回答