我的项目依赖于第三方静态库和three20库。在XCode 3.X中,为了让我的项目进行编译,我必须在“Other Linker Flags”构建设置中使用-force_load标志,并指定我想要包含的三个库中的每一个。
尝试在XCode 4.2中构建存档时,我收到了“重复符号”错误。我通过删除七个单独的-force_load标志解决了这个问题,这些标志引用了我有依赖关系的三个库中的每个库。
我的项目现已成功构建。
我想知道是否有人可以解释为什么这种变化有效?是否存在XCode 4.2修复的错误,或者是行为改变? This post suggests XCode 3.2中存在一个错误,但如果有人可以为我提供更多关于这个主题的信息,那将是很好的,所以我可以肯定通过删除这些-force_load标志我没有做错事。
谢谢!
答案 0 :(得分:19)
在构建静态库时(根据iOS的要求),您将遇到的一个问题是如何在该库中包含类别中的符号,以便应用程序可以使用它们。链接标志-ObjC
应该提供足够的信息以在这些构建的框架中包含类别,正如Dave Dribin在他的文章here中所描述的那样。
但是,在iPhone OS 2.0和3.0之间,这已停止正常工作。正如我在this answer中提到的,我们在Core Plot框架中遇到了这个问题,发现我们需要添加-all_load
链接器标志以使框架正常工作。 Apple自己发布了Technical Q&A 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静态库目标一起使用,现在工作正常。这是个好消息。