作为一个开发者,我们很多时候要了解编译器到底在做什么,本文主要就库与xcode的设置作一些介绍.
简单的说,库就是编译好的二进制文件,编译的时候只需要link一下;库为分静态库和动态库:
两者的优缺点:
Architectures:
编译选项指定了工程将被编译成支持哪些指令集。支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数据有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。
Valid Architectures:
该编译选项指定了可能支持的指令集,该列表和Architectures列表的交集,将是Xcode最终生成二进制包所支持的指令集。
如何选择支持的指令集:
如果软件对安装包大小非常敏感,可以减少安装包中的指令集。如只支持armv7指令集。不对对于armv7s/arm64指令集设备来说,运行armv7应用是会有一定的性能损失。具体多少目前没有数据。
使用命令查看生成包的处理器类型:lipo -info AppName.app/AppName
配置Architectures为armv7 arm64,Valid Architectures为arm64 armv7 armv7s
使用模拟器编译
什么是指令集:存储在CPU内部,对CPU运算进行指导和优化的硬程序。
什么是ARM:ARM架构过去称作进阶精简指令集机器(Advanced RISC Machine).是一个32位元精简指令集(RISC)中央处理器架构。也称RISC微处理器。
CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构。RISC结构优先选取使用频最高的简单指令,避免复杂指令;将指令长度固定,指令格式和寻址方式种类减少;以控制逻辑为主,不用或减少微码控制等。
不同指令集适配: 机器对指令集的支持是向下兼容的
C代码到可执行文件经历:源代码->预处理器->编译器->汇编器->机器码->链接器->可执行文件(Mach-O)。
预处理:处理源文件中的宏定义,将代码中的宏用其对应的具体内容进行替换;import某个头文件,会用此头文件中的内容去替换这么代码。
链接器:一个.c或.cpp文件就是一个编译单元,编译后产生一个.o目标文件;为了最终生成一个可执行文件、静态库或动态库,就需要把各个编译单元按照特定的约定组合到一起(这里特定的约定指的就是目标文件格式),它定义了目标文件、库文件和可执行文件的格式,这里组合的过程就叫做链接。
在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令,而Other Linker Flags设置的值实际上就是ld命令执行时后面所加的参数。
指定不同文件类型该如何编译。每一条build rule指定了其应用于哪种文件类型,该文件类型是如何被处理的,以及输入内容被放置到何处。