2012-09-07 96 views
1

我想在项目中使用静态库。静态库取决于几个框架... CoreData,CFNetwork,AddressBook等在XCode中使用静态库时必须链接二进制库两次

静态库也使用类别,所以我不得不在主项目的“其他链接器设置”中使用-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 

这个项目的目标是在构建阶段>链接二进制与图书馆联系到必要的框架。这包括CoreData.framework,AddressBook.framework等。

现在我想要做的是将这个库添加到我的另一个项目。实际上,我想将这个库添加到我从此出来的每个新项目中,因此我总是可以轻松访问我编写的便利功能/类别。所以:我将库添加到我的项目中,然后将.a文件添加到“构建阶段”>“链接二进制库(我的主项目)”中。我也做了我所知道的其他一切(见评论)。

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

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

有没有办法从静态库自动添加链接的框架到主项目,或者我应该将库分成CoreDataStaticLibrary等,然后要求开发人员添加CoreData.framework以及静态图书馆每次到项目目标?

+0

我认为Xcode尝试将所有源代码链接到可执行文件而不是静态库。你确定你使用了适当的设置吗? – 2012-09-07 17:12:05

+0

将库xcodeproj拖到我的主项目中。我在我的主项目中添加了“Target Dependencies”库。我在我的主项目中添加了库的.a文件以“链接Binary与库”。我在主项目的构建设置中将“-all_load”添加到其他链接设置。我将主项目的标题搜索路径更改为库目录,并进行递归。我错过了什么吗? –

+0

我有类似的问题,并没有找到一种方法来使用all_load标志呢,我可以建议的唯一办法就是尝试使用-force_load标志,或者将类别放入IOS通用框架中。 [链接](https://github.com/kstenerud/iOS-Universal-Framework)。如果你可以用-force_load来完成,那么这可能是一个更好的解决方案。 –

回答

1

据我所知,如果你的图书馆只包含类别,你应该只需要-all_load。否则,您可以使用-ObjC。无论如何,这就是我所用的。

另外,当您构建一个静态库时,您只是创建一个编译对象模块的存档。库中没有解决外部依赖关系。真的,你应该把它看作一组目标代码文件的单个集合。

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

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

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

+0

耻辱XCode无法拉出框架依赖关系。这就是我一直在寻找......哦,好吧。感谢您确认它不起作用。 –

0

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

说过,你永远不会从你的那样的图书馆。由于这些框架是动态链接的,它们并不真正属于你的静态库,所以只有引用指向它们。

此类库的用户应负责添加必要的框架以使其正常工作。这意味着,你不必将你的库链接到这样的框架(因为这样的东西根本没有意义),只需将它们添加到将要使用它的项目即可。 (看看Restkit看看它是如何完成的)。我认为你可以摆脱“all_load”标志,并尝试用“force_load/path/to/the/library”替换它。all_load仅在库仅包含类别时才是必需的所有)。

让我们知道它是如何和快乐的编码!