关于Xcode上的Other linker flags

简介:

问题

在ios开发过程中,有时候会用到第三方的静态库(.a文件),然后导入后发现编译正常但经常有运行时会出现多种类型的错误,从而导致程序闪退。


可能的解决方案

解决上述问题的一种极有可能的解决方案是修改工程Build Settings选项卡Linking命令组中Other linker flags,如图所示。

wKiom1bcsurC2NKfAAS5kHSUHKs986.jpg

Linking命令组中Other linker flags

Other Linker Flags里加的参数主要有如下三个:

  • -ObjC

  • -all_load

  • -force_load

下面来说说每个参数存在的意义和具体做的事情。

首先是-ObjC,一般这个参数足够解决前面提到的问题,苹果官方说明如下:

This flag causes the linker to load every object file in the library that defines an Objective-C class or category. While this option will typically result in a larger executable (due to additional object code loaded into the application), it will allow the successful creation of effective Objective-C static libraries that contain categories on existing classes.

简单说来,加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中,虽然这样可能会因为加载了很多不必要的文件而导致可执行文件变大,但是这个参数很好地解决了我们所遇到的问题。但是事实真的是这样的吗?

如果-ObjC参数真的这么有效,那么事情就会简单多了。

Important: 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 -allload or -forceload flags.

当静态库中只有分类而没有类的时候,-ObjC参数就会失效了。这时候,就需要使用-all_load或者-force_load了。

-all_load会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。

-force_load所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。

参考:

1.http://www.cnblogs.com/robinkey/archive/2013/05/27/3101095.html

2.http://my.oschina.net/ffs/blog/372850

3.http://my.oschina.net/u/728866/blog/194741
















本文转自朱先忠老师51CTO博客,原文链接:http://blog.51cto.com/zhuxianzhong/1748235 ,如需转载请自行联系原作者





相关文章
|
iOS开发 编译器 C语言
(转载)Xcode中other linker flags的作用
原文地址:https://blog.csdn.net/iosfengguibin/article/details/52086435 今天导入三方的sdk之后,空项目,总是报错“selector not recognized”,在网上找到这篇文章,才解决了问题,感谢作者的分享。
1229 0
|
8月前
|
jenkins Unix 持续交付
个人记录jenkins编译ios过程 xcode是9.4.1
个人记录jenkins编译ios过程 xcode是9.4.1
130 2
|
8月前
|
Linux 数据安全/隐私保护 iOS开发
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
|
5月前
|
iOS开发 MacOS Perl
解决Xcode运行IOS报错:redefinition of module ‘Firebase‘和could not build module ‘CoreFoundation‘
解决Xcode运行IOS报错:redefinition of module ‘Firebase‘和could not build module ‘CoreFoundation‘
206 4
|
5月前
|
iOS开发 开发者
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
310 3
|
5月前
|
iOS开发
mac不通过Xcode直接打开IOS模拟器
mac不通过Xcode直接打开IOS模拟器
292 24
|
5月前
|
缓存 iOS开发
如何在Xcode删除某个版本的IOS模拟器
如何在Xcode删除某个版本的IOS模拟器
678 1
|
7月前
|
iOS开发
技术好文:xcode动态图,ios实现动态图,iosgif,暂停和继续播放
技术好文:xcode动态图,ios实现动态图,iosgif,暂停和继续播放
102 24
|
8月前
|
存储 定位技术 iOS开发
XCode8升级到Xcode9(操作系统为iOS11)后原来的工程中遇到的问题
XCode8升级到Xcode9(操作系统为iOS11)后原来的工程中遇到的问题
149 23
|
8月前
|
Linux 数据安全/隐私保护 iOS开发
Xcode8.1如何支持iOS8.0以下版本
Xcode8.1如何支持iOS8.0以下版本
58 0