介绍
MakeFile文件指定工程用到的文件、框架、库等信息,将整个过程进行自动化。
theos中.mk的说明
这里我就拿theos生成的模板中的 MakeFile文件进行对应的介绍、
include theos/makefiles/common.mk #固定写法
TWEAK_NAME = iOSREProject #项目创建时候的项目名称
iOSREProject_FILES = Tweak.xm #tweak 包含的源文件(不包括头文件)
include $(THEOS_MAKE_PATH)/tweak.mk
after-install:: #当tweak安装成功后杀掉SpringBoard进程,好让我们写的程序hook到对应代码上
install.exec "killall -9 SpringBoard"
接下来我们进行介绍,如何指定SDK的版本,导入什么framework, lib文件在哪里的链接。
- 指定处理器架构
ARCHS = armv7 arm64
这里指定了两种不同的处理器架构,中间必须存在空格进行分割。
注意:采用arm64架构的App不兼容armv7/armv7s架构,必须适配arm64架构的dylib。
* 指定SDK版本
TARGET = iphone:Base SDK:Deployment Target
比如
TARGET = iphone:8.1:8.0
这句语法的含义为:指定采用8.1版本的SDK,并发布对象为IOS 8.0及以上版本。也可以吧“Base SDK”设置为“latest”,指定以Xcode附带的最新版本SDK编译,如:
TARGET = iphone:lastest:8.0
- 导入framework
iOSREProject_FRAMEWORKS = framework name
例如:
iOSREProject_FRAMEWORKS = UIKit CoreTelephony CoreAudio
上面语句是增加AppStore级别的共有API接口,而我们是进行theos开发当然是想要拿到“PRIVATE”中的方法。在使用时候,需要明白 每个IOS版本之间可能发生变化,再导入之前,一定要确认好 导入的private framework 确实存在
iOSREProject_PRIVATE_FRAMEWORKS = private framework name
例如:
iOSREProject_PRIVATE_FRAMEWORKS = AppSupport ChatKit IMCore
接下来我们进行看一个实际案例文件进行了解其中的注意点:
ARCHS = armv7 arm64
TARGET = iphone:latest:7.0
include theos/makefiles/common.mk
TWEAK_NAME = iOSREProject
iOSREProject_FILES = Tweak.mk
iOSREProject_PRIVATE_FRAMEWORK = BaseBoard
incluce $(THEOS_MAKE_PATH)/tweak.mk
after-install:: install.exec "killall -9 SpringBoard"
上面的语句可以编译和链接,并不会报错。但是,因为BaseBoard这个private framework只存在于8.0以上的版本的SDK中,在IOS7 里并没有,所以这个tweak在IOS 7 中因为不会找到framework 而无法进行工作。这种情况可以通过弱引用(谷歌搜索 “makefile weak linking”)或dlopen()、dlsym() 和 dlclose()系列函数动态调用private framework来解决。
- 链接Match-o对象(Match-O object)
iOSREProject_LDFLAGS = -lx
theos 采用GUN Linker来链接Mach-O对象,包括.dylib
、 .a
和 .o
。
这样,链接Mach-O对象就很方便了,例如,要链接libsqlite3.0.dylib 、libz.dylib 和dylib1.0
像下面这样写就OK
iOSREProject_LDFLAGS = -lz -lsqlite3.0 -dylib1.o