一,概述

  • 问题场景一

    当从网上去下载一些之前的完整的项目的时候,用终端也  pod update了,但一运行,熟悉的linker错误就出来了。
    • 解决办法

      • Other Linker Flags(也即 OTHER_LDFLAGS)中添加$(inherited)
      • Header/Framework Search Paths(也即HEADER_SEARCH_PATHSFRAMEWORK_SEARCH_PATHS) 添加$(PODS_ROOT)/Headers
  • 问题场景二

    当从网上下载第三方类库拉到项目里编译的时候linker兄弟就会又来找你了,有的新手开发者就会以为是类库或者自己项目的原因,其实不是的,
    • 解决办法

      • Target-->Build Phases-->compile Sources 中,第三方库的所有.m文件都添加到里面,然后就可以了。
  • 问题场景三

    xcode7.0以后,模拟器运行没事,可是真机运行就会出错。解决办法:选中项目->双击->target->buildSeting->搜索BITCODE,默认是yes,修改成no
    • 解决办法

      • 选中项目->双击->target->buildSeting->搜索BITCODE,默认是YES,修改成NO。  重新编译就OK了。  

二,关于Other Linker Flags

  • 使用场景

      在ios开发中,我们经常会使用到第三方的一些静态库,导入第三方类库运行程序后你会发现,编译时可以正常编译但是运行时会app会闪退,报出selector not recognized的错误。
      一般的第三方库的开发文档中都会写出这种问题的解决方法,如在Other Linker Flags中加入-ObjC或者-all_load或者-force_load这样的解决方法。为什要这要做呢?报错为什么编译的时候有问题呢,首先我们先引入一个链接器的概念.

  • 链接器

    还记得我们在学习C程序的时候,从C代码到可执行文件经历的步骤是:

    源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件
    • 在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。

    • 链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件通过这个流程你也应该知道为什么在编译的过程中没事而在运行的时候就会报错了.

    • 那我们为什么要设置Other Linker Flags呢? 因为Other Linker Flags其实就是链接器工作时除了默认参数外的其他参数。

  • 闪退的原因

    苹果官方Q&A上有这么一段话:

    The “selector not recognized” runtime exception occurs due to an issue between the implementation of standard UNIX static libraries, 
    the linker and the dynamic nature of Objective-C. Objective-C does not define linker symbols for each function (or method, in Objective-C) - instead, linker symbols are only generated
    for each class. If you extend a pre-existing class with categories, the linker does not know to associate the object code of the core class
    implementation and the category implementation. This prevents objects created in the resulting application from responding to a selector that is defined in the category.

    翻译:
      运行时的异常时由于静态库,链接器,与OC语言的动态的特性之间的问题,OC语言并不是对每一个函数或者方法建立符号表,而只是对每一个类创建了符号表.如果一个类有了分类,那么链接器就不会将核心类与分类之间的代码完成进行合并,这就阻止了在最终的应用程序中的可执行文件缺失了分类中的代码,这样函数调用接失败了.

  • other linker flags参数的作用

    在前面我们说如果出现问题要在Other Linker Flags中加入-ObjC或者-all_load或者-force_load,我们为什么要加入这样的参数呢,他们究竟做了什么事呢?下面就是对这个三个参数的一个讲解.   

    • ObjC 
      一般这个参数足够解决前面提到的问题,这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大,因为加载了很多不必要的文件而导致可执行文件变大。但是如果静态库中有类和category的话只有加入这个flag才行,但是Objc也不是万能的,当静态库中只有分类而没有类的时候,Objc就失效了,这就需要使用-all_load或者-force_load了。

    • -all_load 
      -all_load会强制链接器把目标文件都加载进来,即使没有objc代码。
      但是这个参数也有一个弊端,那就是你使用了不止一个静态库文件,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件这里会有两种方法解决 1:用命令行就行拆包. 2:就是用下面的这个参数

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

三,总结

  个人建议ObjCforce_load搭配使用比较好.

  • 包含静态库时候需要在TargetOther linker flags里面加上值:-objC,-all_load,-force_load

    对于64位机子和iPhone OS应用

    解决方法是:
      使用-all_load 或者 -force_load

    • 1. -all_load强迫链接器从它能看见的所有文档中加载所有的对象文件,甚至那些没有OC代码的文档。

    • 2. -force_load适用于Xcode3.2+版本,它允许finer得到文档加载的控制。每一个-force_load操作必须跟着一个文档路径,文档中的每一个对象文件将会被加载。

  • -objC,-all_load,-force_load 的用法

    • 1. -all_load就是会加载静态库文件中的所有成员,

    • 2. -ObjC就是会加载静态库文件中实现一个类或者分类的所有成员,

    • 3. -force_load(包的路径)就是会加载指定路径的静态库文件中的所有成员。

四,个人问题解决:

  • 问题一:

    说file not found for libAppententiveConnect.a。因为该文件我已经删除,我始终无法明白为什么在archive工程总报错。

    最后发现force_load会强制加载跟随在后头的路径。也就是$(BUILT_PRODUCTS_DIR)/libAppententiveConnect.a.随后删除这两个。工程就没有问题了.

  • 问题二:

    最近在用pod引入新的三方库时,突然出现

    [!] The `UQIGOU [Debug]` target overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods/Pods.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    
        - Use the `$(inherited)` flag, or
    
        - Remove the build settings from the target.
    
    [!] The `UQIGOU [Debug]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods/Pods.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    
        - Use the `$(inherited)` flag, or
    
        - Remove the build settings from the target.
    
    [!] The `UQIGOU [Release]` target overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation
    
        - Use the `$(inherited)` flag, or
    
        - Remove the build settings from the target.
    
    [!] The `UQIGOU [Release]` target overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation
    
        - Use the `$(inherited)` flag, or
    
        - Remove the build settings from the target.

    • 这很显然是配置的问题,现在记录下解决方法
      进入对应的工程中,找到Build setting对应的地址,这个地址就是你出现问题是弹出的内容,我这里的地址就是两个  'HEADER_SEARCH_PATHS'和 'OTHER_LDFLAGS',这两个就是上面那四个[!]里给出的,分别对应两种状态调试和发布([Debug]和[Release]),在对应的工程中把`$(inherited)`加进去即可,注意,去掉''

      • HEADER_SEARCH_PATHS设置

      • OTHER_LDFLAGS设置 

         

    

Xcode 编辑器之关于Other Linker Flags相关问题的更多相关文章

  1. Xcode编辑器之基本使用(一)

    前言. 苹果原生xcode使用介绍文档 1.Xcode IDE概览 说明: 从左到右,依次是“导航窗格(Navigator)->边列(Gutter)->焦点列(Ribbon)->代码 ...

  2. Xcode 编辑器之Workspace,Project,Scheme,Target

    一,前言 最近老是突然对Workspace,Project,Scheme,Target四者的关系有些疑惑,所以查阅资料总结一下. 二,Workspace,Project,Scheme,Target四者 ...

  3. Xcode编辑器之filter查找功能和查看最近修改的文件

    一,前言 有时候,我们的项目过大,创建类过多就会造成“目标文件”不好查找.这时候通过“filter”进行目录结构筛选无疑是最好的选择. 二,什么是filiter filiter 顾名思义为“过滤”,“ ...

  4. Xcode编辑器之快捷键的使用

    一,快捷键图标 图标 键盘 ⌘ Command ⌃ Control ⌥ Option ⇧ Shift 二, 常用快捷键 文件快捷键 快捷键 键盘  描述 ⌘N  command + N 新文件 ⇧⌘N ...

  5. xcode:关于Other Linker Flags

    一.关于Other Linker Flags xcode中,在“Targets”选项下有Other Linker Flags选项,在这里可以填写xcode链接器的参数,如:-ObjC.-all_loa ...

  6. iOS 关于Xcode上的Other linker flags

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

  7. 关于Xcode上的Other linker flags

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

  8. iOS关于Xcode上的Other linker flags

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

  9. 【转】关于Xcode的Other Linker Flags

    链接器 首先,要说明一下Other Linker Flags到底是用来干嘛的.说白了,就是ld命令除了默认参数外的其他参数.ld命令实现的是链接器的工作,详细说明可以在终端man ld查看. 如果有人 ...

随机推荐

  1. 第二章--k-近邻算法(kNN)

    一.k-近邻算法(kNN) 采用测量不同特征值之间的距离方法进行分类 工作原理: 存在一个样本数据集合(训练样本集),并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输 ...

  2. CF 452E. Three strings(后缀数组+并查集)

    传送门 解题思路 感觉这种题都是套路之类的??首先把三个串并成一个,中间插入一些奇怪的字符,然后跑遍\(SA\).考虑按照\(height\)分组计算,就是每个\(height\)只在最高位计算一次, ...

  3. CF 1172E Nauuo and ODT ——LCT

    题目:http://codeforces.com/contest/1172/problem/E LCT好题. 考虑对每个颜色求出 “不是该颜色的点组成的连通块的 siz2 之和” .每个颜色用 LCT ...

  4. [CSP-S模拟测试]:Race(数学+Trie树)

    题目描述 一年一度的运动会开始了.有$N$个选手参赛,第$i$个选手有一个能力值(保证$A[i]$两两不同),比赛一共进行了天.在第$j$天($0\leqslant j\leqslant 2^{m-1 ...

  5. printf ("%*.*s")

    小数点.后“*”表示输出位数,具体的数据来自参数表printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”. 同样,小数点 ...

  6. python unittest 之mock

    1.什么是mockunittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西.它的主要功能是使用mock对象替代掉指定 ...

  7. delphi 在代码中 添加 TO-DO 并且 管理

    TO-DO List是一项非常好用的功能.采用她可以让我们很清楚的了解以前完成了那些任务,还有哪些任务需要做,由谁负责完成,是不是比较紧急的任务等.今天来不及完成的,明天上班就可以很快的找到任务所在的 ...

  8. Thrift报错:Error: Thrift compiler: Failed to translate files. Error: Cannot run program thrift error=2

    文章目录 报错: 原因: 解决: 报错: Error: Thrift compiler: Failed to translate files. Error: Cannot run program th ...

  9. (转)关于SimpleDateFormat安全的时间格式化线程安全问题

    想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调 ...

  10. BZOJ 4657 (网络流)

    题面 Nick最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n*m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些BETA狗,Nick需要操纵炮塔攻击BETA狗们. 攻击方法是:对于 ...