问题描述
拖入一张图片或者一个下载好的第三方框架文件到目录结构下,编译不报错,运行时会报错;
问题原因
可能是
Xcode 9
的一个bug,编译期间没有添加文件到Compile Sources
问题重现
- 拖入下载好的
Masonry
框架到项目中; - 导入头文件,使用;
- 查看
TARGETS ~> Build Phases ~> Compile Sources
,发现没有自动添加到Compile Sources
; Command+b
,编译成功(说明Xcode甚至没有检查对错);Command+r
,运行报错;
- 拖入下载好的
问题解决方式一
- 编译之前,在
TARGETS ~> Build Phases ~> Compile Sources
中手动添加 - 图片处理:在
TARGETS ~> Build Phases ~> Copy Bundle Resources
中手动添加 - 缺点:工作量大
- 编译之前,在
- 问题解决方式二
- 复制下载好的
Masnory
框架,预先写好代码,项目show in finder
,粘贴; - 工程
Add Files To
; - 查看
Build Phases ~> Compile Sources
; Command+b
,编译成功;Command+r
,运行成功;
- 复制下载好的
解释
Target Dependencies
:编译依赖关系
将lib工程的target加入到里面,告诉主工程当lib工程发生变化的时候自动编译它。Compile Sources
:编译源文件
这个阶段编译所有的源文件;默认情况下,项目中添加任何一个源文件,也将添加到编译列表中。Link Binary With Libraries
:连接二进制文件和库
在完成源文件的编译之后,连接框架(或库),这样代码就可以使用这些框架类了。Copy Bundle Resources
:复制绑定资源
在源文件编译和连接库之后,创建一个可执行文件,并放置在应用程序的绑定中,其实就是一个文件夹。其中资源文件将和可执行文件一起添加到绑定(bundle)中。这些资源文件是数据文件,应用程序在运行时需要使用,如XIB 文件和图像文件、声音文件等等。默认情况下,添加到项目中的文件,如不是源代码文件,将添加到这个构建阶段(Build Phase)。