iOS小技能:Makefile的使用(Makefile的规则、部署脚本、config管理ssh连接)

简介: make是一个命令工具,是一个解释makefile中指令的命令工具。其本质是**文件依赖**,Makefile文件制定编译和链接所涉及的文件、框架、库等信息,将整个过程自动化。

前言

make是一个命令工具,是一个解释makefile中指令的命令工具。其本质是文件依赖,Makefile文件制定编译和链接所涉及的文件、框架、库等信息,将整个过程自动化。
一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

例子: 使用别名配置IP

I 预备知识

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。那么先来了解下什么是编译?

  1. 编译: 把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译。
  2. 链接: 把大量的Object File合成执行文件

源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。

每个源文件都应该对应于一个中间目标文件(OBJ文件)

1.1 编译

在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。

只有所有的语法正确,编译器才可以编译出中间目标文件。至于函数与变量的声明的正确,就是指头文件的所在位置。

1.2 链接

主要是链接函数和全局变量,所以可以使用这些中间目标文件来链接我们的应用程序。

在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。

II Makefile的规则

    target... : prerequisites ...
          command
          ...
          ...
         -------------------------------------------------------------------------------
AI 代码解读
  • 例子

THEOS_DEVICE_IP=iphone    #5C9 #配置IP的host 别名
TARGET = iphone:latest:8.0
ARCHS = armv7 arm64
THEOS=/opt/theos
THEOS_MAKE_PATH=$(THEOS)/makefiles
include $(THEOS)/makefiles/common.mk

TWEAK_NAME =
Taoke_FILES = Taoke.xm 

Taoke_FRAMEWORKS = UIKit, Foundation, Security, IOKit, JavaScriptCore

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "echo '' > /var/log/syslog"
    install.exec "killall -9 WeChat"
    install.exec "killall -9 Moon"
AI 代码解读
  • target也就是一个目标文件,可以是Object File ,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
  • prerequisites就是要生成那个target所需要的文件或是目标
  • command也就是make需要执行的Shell命令
  • make clean清除所有的目标文件,以便重编译。

一个简单的例子

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"
AI 代码解读
注意:BaseBoard这个private framework只存在于8.0以上的版本的SDK中,在IOS7 里并没有,所以这个tweak在IOS 7 中因为不会找到framework 而无法进行工作。这种情况可以通过弱引用( “makefile weak linking”)或dlopen()、dlsym() 和 dlclose()系列函数动态调用private framework来解决。
  • 链接Match-o对象(Match-O object)

Theos 采用GUN Linker来链接Mach-O对象,包括.dylib、 .a 和 .o 。
例如,要链接libsqlite3.0.dylib 、libz.dylib 和dylib1.0像下面这样写就OK

iOSREProject_LDFLAGS = -lz -lsqlite3.0 -dylib1.o 
AI 代码解读
  • 开启arc: 不用自己手动进行内存管理
$(TWEAK_NAME)_CFLAGS += -fobjc-arc
AI 代码解读
  • 单独为单个文件指定mrc
ZKSwizzle/ZKSwizzle.m_CFLAGS = -fno-objc-arc
AI 代码解读

III 集成第三方库

3.1 编译参数指定一些编译链接参数、搜索路径

TweakDemo_CFLAGS = -fobjc-arc -Wno-int-to-void-pointer-cast -Wno-int-to-pointer-cast -I./BookLib/include -F./BookFramework # 指定头文件位置
ZKSwizzle/ZKSwizzle.m_CFLAGS = -fno-objc-arc # 设置单个文件的MRC
TweakDemo_LDFLAGS = -L./BookLib -F./BookFramework # 链接
TweakDemo_LIBRARIES = BookLib #.a
TweakDemo_FRAMEWORKS = BookFramework # framke
AI 代码解读
  • 导入头文件直接调用
// 这个第三方库或者头文件也可以放到 /opt/theos/对应的目录
#import <BookLib/BookLib.h> //.a
#import <BookFramework/BookFramework.h>// framework
AI 代码解读

3.2 使用 ASIHTTPRequest 的例子

 20 RESOURCE_DIR = Resources
#编译 ----------------------------ASIHTTPRequest--------------------
 32 service_FILES += ASIHTTPRequest/ASIAuthenticationDialog.m
 33 service_FILES += ASIHTTPRequest/ASIDownloadCache.m
 34 service_FILES += ASIHTTPRequest/ASIFormDataRequest.m
 35 service_FILES += ASIHTTPRequest/ASIHTTPRequest.m
 36 service_FILES += ASIHTTPRequest/ASIInputStream.m
 37 service_FILES += ASIHTTPRequest/ASINetworkQueue.m
 38 service_FILES += ASIHTTPRequest/Reachability.m
 39 
 40 #编译 ----------------------------Encoder---------------------------
 41 service_FILES += Encoder/CrypHelper.m
 42 service_FILES += Encoder/GTMBase64.m
 43 service_FILES += Encoder/NSData+Base64.m
 44 service_FILES += Encoder/NSString+MD5Addition.m
 45 service_FILES += Encoder/UIDevice+IdentifierAddition.m
 46 
 47 #编译 ----------------------------TBXML-----------------------------
 48 service_FILES += TBXML/NSDataAdditions.m
 49 service_FILES += TBXML/TBXML.m
 50 
 51 #编译 ----------------------------Regex-----------------------------
 52 service_FILES += Regex/RegexKitLite.m
 53 
 54 #编译 ----------------------------Constant--------------------------
 55 service_FILES += Constant/Constant.m
 56 service_FILES += Constant/UserDefaults.m
 57 

#连接单元
 87 #
 88 #连接 ----------------------------framework--------------------------
 89 service_FRAMEWORKS = Foundation UIKit QuartzCore Foundation CoreFoundation CoreGraphics  MobileCoreServices
 90 service_FRAMEWORKS += SystemConfiguration  CFNetwork CoreTelephony CoreLocation MapKit
 91 
 92 
 93 #连接 ----------------------------dylib------------------------------
 94 service_LDFLAGS = -lxml2 -lz -licucore -lgcc -lgcc_eh -lstdc++ 
 95 service_LDFLAGS += -L./BaiduMap/inc -R./BaiduMap/inc/ -lbaidumapapi
 96 
 97 #编译器 ----------------------------------------------------------
 98 #service_CFLAGS += -std=c99 
 99 #service_CFLAGS += -all_load
100 
101 #资源文件 ----------------------------------------------------------
102 internal-package::
103    ifneq ($(wildcard $(RESOURCE_DIR)/*.png), )
104     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
105     cp $(RESOURCE_DIR)/*.png $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)/
106    endif
107    ifneq ($(wildcard $(RESOURCE_DIR)/*.lproj), )
108     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
109     rsync -avC $(RESOURCE_DIR)/*.lproj $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
110    endif
111    ifneq ($(wildcard $(RESOURCE_DIR)/$(TWEAK_NAME).plist), )
112     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
113     cp $(RESOURCE_DIR)/$(TWEAK_NAME).plist $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
114    endif
115 
AI 代码解读

20行存放资源文件的本地目录名称:可以自定义 主要是在生成包拷贝时使用。

  • CFLAGS 指定头文件(.h文件)的路径
CFLAGS=-I/usr/include -I/path/include
AI 代码解读
 TWEAK_NAME_CFLAGS += -I./include
AI 代码解读

有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给"-Wl,R":

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
AI 代码解读

IV deploy 部署脚本

#!/bin/sh
cd `dirname $0` 
make clean
make package install

scp ./taoke.lua iphone:/private/var/mobile/Media/TouchSprite/lua/#配置IP的host 别名

rm -f ./debs/*
exit 0
AI 代码解读

4.1 layout的应用

应用场景: 新增图片、文件等资源文件,或者二进制可执行文件;然后在代码中调用使用它们。这个时候可以使用layout目录指定文件到特定的路径。

  • 获取文件的代码如下
    NSString* resourcePath = @"/Library/Application Support/TweakDemo/";
    NSDictionary* resourceDict = [[NSDictionary alloc] initWithContentsOfFile:[resourcePath stringByAppendingPathComponent:@"resource.plist"]];
    NSLog(@"resourceDict:%@", resourceDict);
AI 代码解读

4.2 使用ssh config配置文件来管理ssh连接

config 文件:设置IP

https://blog.csdn.net/z929118967/article/details/78219687
# Private 192.168.2
Host iphone
HostName  192.168.2.131
User root 
IdentityFile ~/.ssh/id_rsa_Theos125

Host gitlab.cn
HostName  gitlab.cn
User git
IdentityFile ~/.ssh/id_rsa_q



# Private github
Host github.com
HostName  github.com
User git
IdentityFile ~/.ssh/id_rsa
AI 代码解读

一个SSH的认证文件可以重复使用到不同的host

devzkndeMacBook-Pro:.ssh devzkn$  ssh-copy-id -i id_rsa_Theos125.pub root@192.168.2.150
AI 代码解读

V 总结

# 系统配置部分    export THEOS=/opt/theos/
#   RESOURCE_DIR = Resources  存放资源文件的本地目录名称:可以自定义 主要是在生成包拷贝时使用  #资源文件 ----------------------------------------------------------102 internal-package::
# 调试设备的IP地址
THEOS_DEVICE_IP=iphone150    #5C9
TARGET = iphone:latest:8.0
ARCHS = armv7 arm64
THEOS=/opt/theos
THEOS_MAKE_PATH=$(THEOS)/makefiles
# 引入常用的一般模板
include $(THEOS)/makefiles/common.mk
# 工程名称
TWEAK_NAME =
# :常用的一个宏设置是否显示NSLog 区分是debug还是release 也可以自己尝试设置其他宏变量
DEBUG = 0

# 编译所需要的的源文件
Taoke_FILES = Taoke.xm 
# sdk中的framework
Taoke_FRAMEWORKS = UIKit, Foundation
#CXXFLAGS 表示用于 C++ 编译器的选项。
ADDITIONAL_CCFLAGS  = -Qunused-arguments
# gcc等编译器会用到的一些优化参数 也可以在里面指定库文件的位置;例如需要的一些系统静态库和第三方静态库 例如,要链接libsqlite3.0.dylib 、libz.dylib 和dylib1.0  TWEAK_NAME_LDFLAGS = -lz -lsqlite3.0 -dylib1.o   或者使用TWEAK_NAME_OBJ_FILES += libcurl.a  指定库文件的位置的用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib -WL,R 运行时库文件的路径也得到扩展-Wl,R/var/xxx/lib
ADDITIONAL_LDFLAGS  = -Wl,-segalign,4000
# CFLAGS 表示用于 C 编译器的选项, 际上涵盖了编译和汇编两个步骤 编译器参数设置 #service_CFLAGS += -std=c99  #service_CFLAGS += -all_load   RedRobert_CFLAGS += -Wno-error 忽略的编译错误  TWEAK_NAME_CFLAGS += -I./include
ADDITIONAL_CFLAGS = -Werror -Wobjc-method-access
# 引入tweak模板
include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "echo '' > /var/log/syslog"
    install.exec "killall -9 WeChat"
    install.exec "killall -9 Moon"
AI 代码解读

see also

iOS 逆向: 批量部署Tweak插件到iOS设备的方案(how to host cydia repo?)

https://kunnan.blog.csdn.net/article/details/78344104
目录
打赏
0
0
0
0
480
分享
相关文章
linux免密登录报错 Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
linux免密登录报错 Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
395 1
Docker部署ssh连接工具webssh2
【8月更文挑战第2天】Docker部署ssh连接工具webssh2
412 6
Docker部署ssh连接工具webssh2
App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
483 0
"革新远程访问体验:Docker化部署webssh2,一键启动Web SSH客户端,让远程管理如虎添翼!"
【8月更文挑战第2天】Docker作为软件开发与运维的关键工具,以其轻量级、可移植及强隔离特性简化了应用部署。结合webssh2这一开源Web SSH客户端,可通过浏览器安全便捷地访问SSH服务器,无需额外软件。首先确保已安装Docker,接着拉取webssh2镜像并运行容器,映射端口以便外部访问。配置好SSH服务器后,通过浏览器访问指定URL即可开始SSH会话。此方案不仅提升了用户体验,还加强了访问控制与系统安全。
559 7
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
若依修改,若依部署在本地运行时的注意事项,后端连接了服务器,本地的vue.config.js要先改成localhost:端口号与后端匹配,部署的时候再改公网IP:端口号
若依修改,若依部署在本地运行时的注意事项,后端连接了服务器,本地的vue.config.js要先改成localhost:端口号与后端匹配,部署的时候再改公网IP:端口号
部署常用的流程,可以用后端,连接宝塔,将IP地址修改好,本地只要连接好了,在本地上前后端跑起来,前端能够跑起来,改好了config.js资料,后端修改好数据库和连接redis,本地上跑成功了,再改
部署常用的流程,可以用后端,连接宝塔,将IP地址修改好,本地只要连接好了,在本地上前后端跑起来,前端能够跑起来,改好了config.js资料,后端修改好数据库和连接redis,本地上跑成功了,再改
若依修改---重新部署项目注意事项,新文件初始化需要修改的地方,打包后的文件很难进行修改,如果想要不断修改项目,注意保存原项目,才可以不断修改,前端:在Vue.config.js文件中修改target
若依修改---重新部署项目注意事项,新文件初始化需要修改的地方,打包后的文件很难进行修改,如果想要不断修改项目,注意保存原项目,才可以不断修改,前端:在Vue.config.js文件中修改target
【DevOps】(四)jekins服务器ssh部署
【DevOps】(四)jekins服务器ssh部署
72 1
|
9月前
|
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
290 2

热门文章

最新文章

  • 1
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    40
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    33
  • 3
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    29
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    27
  • 5
    AWS 云安全深度剖析:如何有效监测 SSH 暴力攻击
    4
  • 6
    怎么取消对project.private.config.json这个文件的git记录
    3
  • 7
    springcloud-config客户端启用服务发现报错找不到bean EurekaHttpClient
    4
  • 8
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    27
  • 9
    debian或Ubuntu中开启ssh允许root远程ssh登录的方法
    108
  • 10
    git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
    9
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等