编译(通常我们说的编译包括编译和链接)报错
知识要点:
- 我们知道编译型语言,源文件必须经过编译(build)和链接(link)两个过程才可以产生可执行文件
- build 阶段只有声明就可成功。一般来说就是有头文件
- link 阶段必须有实现文件,具体为m文件
头文件找不到
第一步,分析这是编译问题,也可以通过 xcode 编译日志 查看,(如何查看日志,见前一篇)。
如何找到头文件
header search path
- xcode 默认查找路径
HEADER_SEARCH_PATHS=DerivedData/ProjectTest/Build/Products/Debug-iphonesimulator/include
- xcode 会到 header search path 指定目录查找头文件
将相关的头文件添加到 build seting 的header search path即可
不需要记忆。用上一篇的方法打印出来
inherit
有时我们会看到这个 $(inherited)
意思继承上一个配置。啥意思?
xcode的配置是可以继承的。 如图打开xcode。清清楚楚。
选择level,会有多个配置出现在界面。
最终是 resolved value 为准
几点建议:
- 选中相关条目,xcode都有帮助文档,多看!
- 使用相对路径 (Build settings reference 帮助文档有大量的宏可以使用)
- 也可以使用配置文件,更加灵活
recursive
recursive:循环查找就说在这个目录下的所有目录包括子目录查找。 在设置路径时尽量设置 non-recursive 。
undefined symbol
分析这是链接问题。日志可以看到 ld
命令。
原因一般有:
- 没有添加链接依赖
- 没有找到目标文件
一些遇到的场景:
-
m文件没有参与编译。
选择m文件在xcode中选中对应的target。这个算是原因1吧。
如何添加依赖,如何添加搜索路径。
目前对应ios开发有两种第三方库
- static lib
- framework
- swift 新方式 module
两种方式原理一样,只是操作不同而已
添加搜索路径
和添加头文件路径类似
static library
- xcode 默认查找路径
LIBRARY_SEARCH_PATHS=DerivedData/ProjectTest/Build/Products/Debug-iphonesimulator
framework
- xcode 默认查找路径
FRAMEWORK_SEARCH_PATHS=DerivedData/ProjectTest/Build/Products/Debug-iphonesimulator
将相关的路径添加到 build seting 对应的参数下即可
不需要记忆。用上一篇的方法打印出来
- 也可以使用xcode 拖拽实现()
Build Phases -> Link binary with Libraries
这里有个status 选项
status | frameworks 或者 libraries 存在时机 |
---|---|
Required | App 启动时 必须存在 |
Optional | 使用时必须存在 |
添加依赖
方案1. xcode 拖拽
Build Phases -> Target Dependencies
方案2. other linker flags
-l"xxxx" -framework "xxxx"
参照系统写! 参照前一篇如何查看xcode日志的详情,可以看到大量的用法。
这些配置信息也可以使用 xcconfig 参考xcconfig 文件 简单使用指南
如果你在 xcconfig 文件中定义了非系统变量,变量就会在 xcode 对应target -> build setting -> User-Defined 产生。根据需要使用