Xcode上的Other Linker Flags参数详解

  • Other Linker Flags
    • Other Linker Flags位置
    • 原理介绍
    • 常用参数
  • 总结
  • 参考链接

Other Linker Flags

因为项目中遇到相关问题,对多篇文章进行了融合记录。

Other Linker Flags位置

在Xcode的工程中Tergets -> Build Settings -> linking -> Other Linker Flags,链接系统的标准库 ,链接其他三方库的参数,引用链接器参数

原理介绍

从C代码到可执行文件经历的步骤是:

源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件

  • 预处理器(预编译):在该阶段,编译器将C或者OC中源代码中包含的stdio.h和#import 的库编译进来
  • 编译器:在这个阶段,编译器首先要检查代码的规范性,是否有语法错误等,用来确定代码实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言
  • 汇编器:汇编阶段把编译阶段生成的汇编代码转化成二进制目标文件
  • 链接器:将不同部分的代码和数据收集和组合成一个单一文件的过程,也就是把不同目标文件合并成最终可执行文件的过程,将编译输出的二进制文件链接成最终可执行的目标文件
  • 在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。

注意在链接阶段时,将编译阶段一些只有函数声明的头文件,而没有函数实现的库链接到可执行文件中来)库分为动态库和静态库:

  • 静态库:是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时就不需要额外的库文件(.a) 。
  • 动态库:在程序执行时,由运行时链接文件加载库,这样可以节省系统的开销(.so)。

通过这个流程你也应该知道,为什么在编译的过程中没事,而在运行的时候就会报错了。
那我们为什么要设置Other Linker Flags呢?
因为Other Linker Flags其实就是链接器工作时,除了默认参数外的其他参数。Other linker flags设置的值实际上就是ld命令执行时后面所加的参数。

常用参数

下面逐个介绍3个常用参数:

  • -ObjC
    加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中。
    这样编译之后的app会变大(因为加载了其他的Objc代码进来)。但是如果静态库中有类和category的话,只有加入这个flag才行。
    但是Objc也不是万能的,当静态库中只有分类而没有类的时候,Objc就失效了,这就需要使用-all_load或者-force_load了。
  • -all_load
    这个flag是专门处理-ObjC的一个bug的。用了-ObjC以后,如果类库中只有category没有类的时候这些category还是加载不进来。变通方法就是加入-all_load或者-force-load
    -all_load会让链接器把所有找到的目标文件都加载到可执行文件中,即使没有Objc代码,所以千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件。
    这里会有两种方法解决:

    1. 用命令行就行拆包;
    2. 在遇到-ObjC失效的情况下使用-force_load参数 。
  • -force_load
    所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。

总结

个人建议-ObjC-force_load搭配使用比较好。
包含静态库时候需要在Target的Other Linker Flags里面加上值:-ObjC-all_load-force_load

  • -ObjC就是会加载静态库文件中实现一个类或者分类的所有成员;
  • -all_load会强迫链接器加载所有静态库中的所有对象文件,甚至那些没有OC代码的文档;
  • -force_load(包的路径)就是会加载指定路径的静态库文件中的所有成员,它允许finer得到文档加载的控制,每一个-force_load操作必须跟着一个文档路径,文档中的每一个对象文件将会被加载。

参考链接

  1. https://blog.csdn.net/yuanmengong886/article/details/52687748
  2. https://www.cnblogs.com/tig666666/p/6829382.html
  3. https://www.cnblogs.com/robinkey/archive/2013/05/27/3101095.html
  4. https://blog.csdn.net/bobo553443/article/details/78633340

Xcode上的Other Linker Flags参数详解相关推荐

  1. iOS关于Xcode上的Other linker flags

    Targets选项下有Other linker flags的设置,用来填写XCode的链接器参数,如:-ObjC -all_load -force_load等. 还记得我们在学习C程序的时候,从C代码 ...

  2. 关于Xcode上的Other linker flags

    Targets选项下有Otherlinker flags的设置,用来填写XCode的链接器参数,如:-ObjC-all_load -force_load等 首先,要说明一下Other Linker F ...

  3. Linux系统上hdparm工具参数详解,硬盘检查、测速、设定和优化

    Linux系统上hdparm工具参数详解,硬盘检查.测速.设定和优化 2012/07/25 hdparm, 硬盘 Linux命令相关 1 6,757 hdparm的功能:显示与设定硬盘的参数.hdpa ...

  4. Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多 3--使用Mat图像 ...

  5. OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    (一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多,我们现在先看一下M ...

  6. ioctl 函数 参数 详解

    2019独角兽企业重金招聘Python工程师标准>>> ioctl 函数 参数 详解 2009-04-24 11:55 ioctl函数 本函数影响由fd参数引用的一个打开的文件. # ...

  7. 窗口发送消息参数详解

    窗口发送消息参数详解 //    窗口.发送消息    函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果 中文函数原型: 发送消息(hwnd,msg ...

  8. Windows 窗口发送消息参数详解

    窗口发送消息参数详解 // 窗口.发送消息 函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果中文函数原型: 发送消息(hwnd,msg,wparam ...

  9. CI流水线配置文件参数详解(二)

    文章目录 4. 参数详解(二) 4.9 git tag打标签的使用 4.10 ``allow_failure`` 4.11 ``when`` 关键字用于实现在作业失败时或发生故障时运行的作业 (whe ...

最新文章

  1. MS SQL Server存储过程
  2. python批量删除文件1001python批量删除文件_Python实现递归遍历文件夹并删除文件...
  3. LDF文件丢失, 如何仅用MDF文件恢复数据库呢?
  4. 【Linux】22.当前运行的docker修改环境后,想在本地保存为镜像的方法
  5. Sql2008的行列转换之行转列
  6. Vue官网todoMVC示例
  7. .net中怎样实现json转化时仅仅处理部分属性二?
  8. --noinput loaddata
  9. UDT源码剖析(六):UDT::socket()过程代码注释
  10. 基于Tablestore的Wifi设备监管系统架构实现
  11. office如何快速删除重复数据
  12. 中国风喜庆传统新年元旦海报PSD分层模板
  13. client中周期性边界_RVE周期性边界条件施加
  14. linux 文件名加粗,linux – 具有粗体字体的显示目录 – 如何启用?用.bash_profile?...
  15. PyTorch实战福利从入门到精通之二——Tensor
  16. 可以做服务器操作系统的是,可以做服务器操作系统
  17. 谷歌如何在设计上脱胎换骨
  18. csv用excel打开后乱码的解决方法
  19. 太牛了!阿里p8全面透彻剖析《Netty权威指南》,程序员必看!
  20. 微信小程序引入 vant UI组件库

热门文章

  1. Elasticsearch:Flattened 数据类型映射
  2. 第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 E 题
  3. Canvas+鼠标事件
  4. 5g上行速率怎么提升_5G手机到底牛逼在哪里?(SRS轮发)
  5. seo初级、中级、高级 目标网站SE分析
  6. iOS 简单的学生管理系统(增删改查)
  7. CSS:内边距padding的设置,值的个数表达的意思是什么?
  8. [DAQmx]DAQmx中的控制的学习
  9. 面对严峻的就业形势,如何提升自身就业能力,实现顺利就业
  10. 特征工程特征预处理归一化与标准化、鸢尾花种类预测代码实现