相信很多人写iOS项目仅仅是按照默认醒目生成的配置去写代码,没有去深究过哪些编译配置是什么。这里来介绍总结一下一些相关的配置选项,还有我近来工作的碰到的一些问题,以及最后的解决。
build setting :
顾名思义,这是项目编译前的一些配置。说道项目的编译过程,大家都知道是将源文件(.c , .m等)通过编译转化为目标文件(.o),再通过链接器将.o文件转化为可执行文件。链接的过程就是把醒目里的一些引用库 连进来。有点扯远了。。。 言归正传,这个栏目里的设置很多,就说说一些常见的吧。
Architecture:
Valid Architecture:意思是项目所支持的手机的CPU架构,目前常用的也就是arm64,armv7,armv7s。
armv7设备 : iPhone 4, iPhone 4S
armv7s设备:iPhone 5,iPhone 5s, iPhone 5c
arm64设备:iPhone 5s iPhone 6 iPhone 6s ,iPhone 6p iPhone 7,iPhone 7p
build options:
Enable Bitcode:bitcode是被编译程序的一种中间形式的代码。包含bitcode配置的程序将会在App store上被编译和链接。bitcode允许苹果在后期重新优化程序的二进制文件,而不需要重新提交一个新的版本到App store上。这一项是与ipa包有关系,具体不会影响到性能,但是有的第三方是不支持这一项的,例如 大家熟知的JSONKit 所以需要把这个默认的yes改为no。
Enable Testbility:这是单元测试有关选项,项目里如果没有单元测试 就关了吧。之前先项目里转到(iOS 10 xcode 8)有个问题,不知道有没有使用face++做活体和人脸识别的,这个选项如果是yes会报编译错误,但是(iOS 9,xcode 7)没有问题。原因我也不晓得了。。。如果有人知道的话,欢迎留言。
Linking :
Other Link Flags :这是XCode的链接器参数,有-ObjC ,-all_load, -force_load等取值。
-ObjC:是将项目里的OC类和分类在最后链接到可执行文件中
-all_load:是项目的将所有都链接到可执行文件中,哪怕是一个txt文件。。。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。
默认是只加载 OC 类文件,这个在写项目时没什么影响,但当你写的是.a或者framwork的时候。不加-ObjC或者-all_load,而.a中又有 分类的话 就会报错,因为这个分类并不会被编译到.a中。
Signing:
code sign identity:证书的描述文件,开发用开发的。打包的时候用企业的。
development Team:证书所属的单位。
Prefix header: pch文件。这个不用多讲了吧。。。
Search Path:
User header search paths 和header search path:Library / Header Search Paths是一定会去搜索的。而User Header Search Paths只有在Always Search User Paths为Yes时才会被搜索。编码时候通过 #include 引入头文件的方式有两种 <> 和 ""。<> 是只从 Header Search Paths 中搜索, 而 "" 则能从 Header Search Paths 和 User Header Search Paths 中搜索。换言之 ,假如你把 路径加到 User Header Search Paths 中,那么 你用 #include的方式去引入对应的头文件,就会报错。 如果加到 Header Search Paths, 就没有问题了。
$(SRCROOT) 这个是 当前工程的意思,添加的项目前需要加$(SRCROOT)/... 当然 项目默认是从项目路径下查找,但是项目里有多个target的时候,这个地方就是设置的关键了。
-------------------------------------------华丽的分割线-------------------------------------------
build phaese :
build phaese选项卡
Target Dependencies :就是项目中有多个 target ,而当前的target 需要依赖其他的target,这些target 最后的product是 .a活着framwork。
Compile Sources :
1.是项目里要编译的.m文件,这里有个细节:当编译.a文件的时候可以从这里把你不想编译到.a的文件去掉,但是在原来的.a项目里不会出现编译错误。当把.a导入其他项目调用时 ,会报错误,说那个你去掉的文件例如a.o文件不存在,这说明没有编译进去。如果你的项目里有a.m就不会报错啦。
这个用处就是:给别的项目打包.a的时候很容易出现文件冲突,因为各种泛滥的第三方。。。像afn,sdwebimage等,这时就可以通过去掉.a里对应的文件,前提是 你们使用的版本不要有太大的区别。当然啦,最好不要再.a文件中引用第三方啦,或者 自己去把类名修改成全世界都不会重复的一份,哈哈哈 至少是用的人不会重复。那我就顺便把一个可以统一修改类名的方法的链接贴出来 .
2. 有的是用MRC写的第三方库例如 JSONKit,需要在后边的 compile flags加上-fno-objc-arc表示不启用ARC。
Link Binary With Libraries: 这里是项目用到的第三方类库和系统类库。没啥可说的了
Copy Bundle Resources:这是项目用的资源文件。
网友评论