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静态库目标,它现在工作正常.这是个好消息.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...