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

前端之家收集整理的这篇文章主要介绍了ios – 为什么在XCode 4.2中我的three20依赖项不再需要-force_load?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的项目依赖于第三方静态库和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标记可能做错了.

谢谢!

解决方法

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

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

For 64-bit and iPhone OS applications,there is a linker bug that
prevents -ObjC from loading objects files from static libraries that
contain only categories and no classes. The workaround is to use the
-all_load or -force_load flags.

-all_load forces the linker to load all object files from every archive it sees,even those without Objective-C code. -force_load is
available in Xcode 3.2 and later. It allows finer grain control of
archive loading. Each -force_load option must be followed by a path to
an archive,and every object file in that archive will be loaded.

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

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

原文链接:https://www.f2er.com/iOS/332927.html

猜你在找的iOS相关文章