theos的makefile写法

本文介绍在theos环境下Makefile的编写方法,特别是针对dylib的正确引用方式,提供了一个完整的Makefile示例,并解释了如何指定特定版本的库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

theos的makefile写法与其他linux/unix环境下的makefile写法大同小异,但是对于makefile不熟悉的在导入一些dylib或者framework的时候就会变得很蛋疼。

对于framework可以直接通过Frameworks和private frameworks来导入,但是dylib文件却不能那么简单的写进去,如果要引用zlib,那么如果写成xxx_LDFLAGS =  -zlib,虽然在编译的时候不会提示找不到对应的lib库但是却会提示找不到相关的符号。

这个东西的写法比较蛋疼,例如要调用libz.1.2.5.dylib ,那么写法是去掉前面的lib和最后的.dylib,然后将剩余部分拼到-l后面也就是上图中看到的那个样子:

xxx_LDFLAGS = -lz.1.2.5

详细信息可以参考这个页面:https://github.com/DHowett/theos/issues/15

一个makefile模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#
 # Use this makefile to compile service project.
 # When change SDK or add new files ,re-edit values below.
 # zhj
 # 2012-07-17
 # txtw
 #
 
 export THEOS=/opt/theos/
 export SDKVERSION=5.1
 export THEOS_DEVICE_IP=10.0.2.3
 #192.168.1.157
 #10.0.2.2
 export CURRENT_VERSION = 1104
 
 include theos/makefiles/common.mk
 
 TWEAK_NAME = service
 
 RESOURCE_DIR = Resources
 
 DEBUG = 1
 
 #SUBPROJECTS=servicePreferences
 
 #编译单元
 #
 #
 
 
 #编译 ----------------------------ASIHTTPRequest--------------------
 service_FILES += ASIHTTPRequest/ASIAuthenticationDialog.m
 service_FILES += ASIHTTPRequest/ASIDownloadCache.m
 service_FILES += ASIHTTPRequest/ASIFormDataRequest.m
 service_FILES += ASIHTTPRequest/ASIHTTPRequest.m
 service_FILES += ASIHTTPRequest/ASIInputStream.m
 service_FILES += ASIHTTPRequest/ASINetworkQueue.m
 service_FILES += ASIHTTPRequest/Reachability.m
 
 #编译 ----------------------------Encoder---------------------------
 service_FILES += Encoder/CrypHelper.m
 service_FILES += Encoder/GTMBase64.m
 service_FILES += Encoder/NSData+Base64.m
 service_FILES += Encoder/NSString+MD5Addition.m
 service_FILES += Encoder/UIDevice+IdentifierAddition.m
 
 #编译 ----------------------------TBXML-----------------------------
 service_FILES += TBXML/NSDataAdditions.m
 service_FILES += TBXML/TBXML.m
 
 #编译 ----------------------------Regex-----------------------------
 service_FILES += Regex/RegexKitLite.m
 
 #编译 ----------------------------Constant--------------------------
 service_FILES += Constant/Constant.m
 service_FILES += Constant/UserDefaults.m
 
 #编译 ----------------------------SOAP-----------------------------
 service_FILES += SOAP/Head.m
 service_FILES += SOAP/Body.m
 
 #编译 ----------------------------MsgService-----------------------------
 service_FILES += MsgService/MsgService.m
 service_FILES += MsgService/MessageInfo.m
 service_FILES += MsgService/Msgs/NetBrain.m
 service_FILES += MsgService/Msgs/KeepAliveReturnMsg.m
 service_FILES += MsgService/Msgs/DevBindReturnMsg.m
 service_FILES += MsgService/Msgs/FamilyPhoneMsg.m
 service_FILES += MsgService/Msgs/LocationMsg.m
 
 #编译 ----------------------------ParseXML-----------------------------
 service_FILES += ParseXML/ParseXML.m
 
 
 #编译 ----------------------------Command---------------------------------
 service_FILES += Command/TxtwCommand.m
 
 #编译 ----------------------------BaiduMap---------------------------------
 service_FILES += BaiduMap/MapPointAnnotion.m
 
 #编译 ----------------------------service-----------------------------
 service_FILES += service/service.mm
 service_FILES += Tweak.xm
 
 
 #连接单元
 #
 #连接 ----------------------------framework--------------------------
 service_FRAMEWORKS = Foundation UIKit QuartzCore Foundation CoreFoundation CoreGraphics  MobileCoreServices
 service_FRAMEWORKS += SystemConfiguration  CFNetwork CoreTelephony CoreLocation MapKit
 
 
 #连接 ----------------------------dylib------------------------------
 service_LDFLAGS = -lxml2 -lz -licucore -lgcc -lgcc_eh -lstdc++ 
 service_LDFLAGS += -L./BaiduMap/inc -R./BaiduMap/inc/ -lbaidumapapi
 
 #编译器 ----------------------------------------------------------
 #service_CFLAGS += -std=c99 
 #service_CFLAGS += -all_load
 
 #资源文件 ----------------------------------------------------------
 internal-package::
    ifneq ($(wildcard $(RESOURCE_DIR)/*.png), )
     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
     cp $(RESOURCE_DIR)/*.png $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)/
    endif
    ifneq ($(wildcard $(RESOURCE_DIR)/*.lproj), )
     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
     rsync -avC $(RESOURCE_DIR)/*.lproj $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
    endif
    ifneq ($(wildcard $(RESOURCE_DIR)/$(TWEAK_NAME).plist), )
     mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
     cp $(RESOURCE_DIR)/$(TWEAK_NAME).plist $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/$(TWEAK_NAME)
    endif
 
 include $(THEOS_MAKE_PATH)/tweak.mk

注释:

1
2
3
4
5
6
7
8
9
10
11
9~14行属于系统配置部分:其中11行是调试设备的IP地址
  16行是引入常用的一般模板
  18行工程名称
  20行存放资源文件的本地目录名称:可以自定义 主要是在生成包拷贝时使用
  22行是否是调试状态:常用的一个宏设置是否显示NSLog 区分是debug还是release 也可以自己尝试设置其他宏变量
  26~83行是编译所需要的的源文件
  88~90行是sdk中的framework
  93~95行是需要的一些系统静态库和第三方静态库
  97~99行是编译器参数设置
  101~114行是拷贝资源文件
  116行是引入tweak模板

参考链接:

https://github.com/DHowett/theos/issues/15

http://www.cnblogs.com/qiezi/archive/2012/09/29/2708726.html

https://github.com/DHowett/theos

<think>好的,我现在需要为用户介绍Makefile写法。首先,我要回想自己知道的关于Makefile的知识,确保信息准确。记得Makefile是用于自动化构建程序的工具,特别是在C/C++项目中常见。用户可能是开发者,需要了解如何正确编写Makefile来管理项目编译流程。 首先,我应该从基础结构讲起,比如目标和依赖关系。需要解释清楚目标、依赖和命令之间的关系。示例可能会有帮助,比如一个简单的编译两个文件的Makefile例子。 然后,变量使用是Makefile中的重要部分,比如CC、CFLAGS这些预定义变量,还有自定义变量。需要说明如何定义和使用变量,以及常见的变量类型。 接下来是伪目标,比如clean和install。用户可能需要知道如何编写这些目标来清理构建文件或安装程序。这里要强调.PHONY的作用,避免与同名文件冲突。 模式规则和通配符也是有用的功能,特别是当项目中有多个相似文件需要处理时。例如,用%.o: %.c来简化规则。这时候可能需要举例子说明。 自动化变量部分可能比较复杂,但很重要。比如$@、$^、$<这些符号的含义和用法,需要逐一解释清楚,最好结合例子。 最后,应该提到一些高级用法,比如条件判断和函数,但可能不需要深入,用户如果需要可以进一步学习。同时,给出一个综合示例,展示各部分如何配合使用。 需要检查是否有遗漏的部分,比如注释、语法注意事项(比如命令前必须用Tab),以及常见错误。确保结构清晰,分点说明,让用户逐步理解。 可能遇到的问题是如何将技术细节用中文简洁明了地表达,避免术语混乱。同时,例子要简单易懂,帮助用户快速上手。需要确认每个步骤的逻辑是否正确,避免错误信息。 现在组织内容,按照基础结构、变量、伪目标、模式规则、自动化变量、高级功能、综合示例的顺序进行。确保每个部分都有示例代码,并正确使用$$...$$格式来展示代码块,符合用户提供的系统级指令中的格式要求。 最后,通读整个回答,检查是否符合用户的要求:结构清晰,语法正确,使用中文,正确使用LaTeX格式(比如变量名用$...$),独立公式用$$...$$。确保没有使用任何Markdown格式,所有代码示例正确缩进,命令前的Tab在显示时可能需要用空格代替,或者明确提示用户使用Tab。</think>Makefile用于自动化构建和管理项目编译流程,尤其在C/C++项目中常见。以下分步介绍其核心写法和规则: $$注意:Makefile中的命令必须使用Tab缩进,不能用空格!$$ 1. **基础结构** ```makefile 目标: 依赖文件 命令 ``` 示例: ```makefile app: main.o utils.o gcc main.o utils.o -o app main.o: main.c gcc -c main.c utils.o: utils.c gcc -c utils.c ``` 2. **变量定义** ```makefile CC = gcc CFLAGS = -Wall -O2 OBJS = main.o utils.o app: $(OBJS) $(CC) $(OBJS) -o app ``` 3. **伪目标(清理操作)** ```makefile .PHONY: clean clean: rm -f *.o app ``` 4. **模式规则(简化编译)** ```makefile %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` 5. **自动化变量** - `$@` 当前目标名称:`app` - `$^` 所有依赖文件:`main.o utils.o` - `$<` 第一个依赖文件:`main.o` 6. **函数应用** ```makefile SRCS = $(wildcard *.c) OBJS = $(patsubst %.c,%.o,$(SRCS)) ``` **完整示例** ```makefile CC = gcc CFLAGS = -Wall TARGET = app SRCS = $(wildcard *.c) OBJS = $(SRCS:.c=.o) $(TARGET): $(OBJS) $(CC) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ .PHONY: clean clean: rm -f $(OBJS) $(TARGET) ``` **关键原则** - 依赖关系检查:仅当源文件比目标文件新时触发重新编译 - 变量优先使用`=`进行递归展开,若需立即展开使用`:=` - 通过`include`指令可包含其他Makefile - 使用`@`前缀命令可隐藏命令回显(如`@echo "编译完成"`) 建议通过`make -p`查看内置规则,掌握模式匹配可大幅减少重复代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值