为什么在XCode 4.2中我的three20依赖项不再需要-force_load?

我的项目依赖于第三方静态库和three20库。 在XCode 3.X中,为了让我的项目进行编译,我不得不在“Other Linker Flags”构建设置中使用-force_load标志,并指定我想要包含的三个库中的每一个。

尝试在XCode 4.2中构建存档时,我收到了“重复符号”错误。 我通过删除七个单独的-force_load标志解决了这个问题,这些标志引用了我有依赖关系的三个库中的每个库。

我的项目现在成功构建。

我想知道是否有人可以解释为什么这个改变有效? 是否存在XCode 4.2修复的错误,或者是行为改变? 这篇文章表明 XCode 3.2中存在一个错误,但是如果有人能够为我提供更多关于这个主题的信息,那将是很好的,所以我可以肯定通过删除这些-force_load标志我没有做错事。

谢谢!

在构建静态库时(根据iOS的要求),您将遇到的问题之一是如何在该库中包含类别中的符号,以便应用程序可以使用它们。 链接标志-ObjC应该提供足够的信息以包含这些构建框架中的类别,正如Dave Dribin在他的文章中所描述的那样。

但是,在iPhone OS 2.0和3.0之间,这已停止正常工作。 正如我在本回答中提到的,我们在Core Plot框架中遇到了这个问题,发现我们需要添加-all_load链接器标志以使框架正常工作。 Apple自己发布了技术问答QA1490 ,提到了这个问题:

对于64位和iPhone OS应用程序,存在一个链接器错误,该错误阻止-ObjC从仅包含类别而不包含类的静态库加载对象文件。 解决方法是使用-all_load或-force_load标志。

-all_load强制链接器从它看到的每个存档加载所有目标文件,甚至是那些没有Objective-C代码的存档。 -force_load在Xcode 3.2及更高版本中可用。 它允许更精细的谷物控制存档加载。 每个-force_load选项后面都必须有一个存档路径,并且将加载该存档中的每个目标文件。

不幸的是,这样做的副作用是从多个库链接的重复符号可能会导致您遇到的错误。

我提交了一个关于此的错误报告(早在2009年),现在在Xcode中使用的最新版本的LLVM似乎不再受到这个链接器错误的影响。 我尝试使用-ObjC与Core Plot iOS静态库目标,它现在工作正常。 这是个好消息。