23二/105
iPhone开发进阶(4) — 使用Makefile自动编译iPhone程序
iPhone开发进阶(4) --- 使用Makefile自动编译iPhone程序
Xcode 也支持以命令行形式来编译 iPhone 程序。另外还可以手动的编写 Makefile 文件,实现编译→安装的自动化批处理过程。如果你习惯了命令行的操作方式(linux,unix),那么这样的操作还是很方便的。
首先看看 Xcode 的命令行格式:
1 2 |
xcodebuild -target Project_Name xcodebuild install -target Project_Name |
下面我们来实现程序的编译,并通过 ldid 转换编码格式,最后用 ssh 将编译好的程序安装到 iPhone 上的 /Applications/目录下。
- 首先安装 ssh 的公开密匙到 iPhone 上
-
1). 在Mac的终端上产生密匙
1 2 3 4 5 6 7 8 9 10 |
ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/xxxx/.ssh/id_rsa): Created directory '/home/xxxx/.ssh'. Enter passphrase (empty for no passphrase): xxx Enter same passphrase again: xxx Your identification has been saved in /home/xxxx/.ssh/id_rsa. Your public key has been saved in /home/xxxx/.ssh/id_rsa.pub. The key fingerprint is: e4:e8:b7:05:06:b3:f0:ff:af:13:fc:50:6a:5b:d1:b5 xxxx@localhost.localdomain |
过程中会提问你通行证(passphrase),输入你常用的秘密。
2). 在 iPhone 上创建.ssh目录(iPhone的IP地址是10.0.2.2)
1 |
ssh root@10.0.2.2 'mkdir -p .ssh'
|
如果问道你iPhone root password,输入 alpine。
3). 拷贝刚才生成的公开密匙到 iPhone
1 |
cat ~/.ssh/id_rsa.pub | ssh root@10.0.2.2 'cat >> .ssh/authorized_keys'
|
如果问道你iPhone root password,输入 alpine。
4). 在 iPhone 上编辑 /etc/ssh/sshd_config 文件
1 2 3 4 5 6 7 8 9 10 11 |
#将 #StrictModes yes #PubkeyAuthentication yes #AuthorizedKeysFile .ssh/authorized_keys #替换为 StrictModes no PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys |
5). 重新启动iPhone
- 接下来,编译生成ldid工具
1 2 3 4 5 6 7 8 9 10 11 12 |
wget http://svn.telesphoreo.org/trunk/data/ldid/ldid-1.0.610.tgz tar -zxf ldid-1.0.610.tgz # 如果是 PowerPC 下载下面的补丁 # wget -qO- http://fink.cvs.sourceforge.net/viewvc/*checkout*/fink/dists/10.4/unstable/crypto/finkinfo/ldid.patch?revision=1.1 | patch -p0 cd ldid-1.0.610 g++ -I . -o util/ldid{,.cpp} -x c util/{lookup2,sha1}.c sudo cp -a util/ldid /usr/bin |
- 最后,让我们看看Makefile中都有什么
项目中的文件如下所示:
Classes : source code (.m .c .cpp etc) Resources : png file and other support files Project folder : *.xib Info.plist
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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
Makefile: Select all PREFIX = arm-apple-darwin9- ###///////////////////////////////////////////////////////////// ### Executable files ###///////////////////////////////////////////////////////////// CC = $(PREFIX)gcc CXX = $(PREFIX)g++ LD = $(CC) AR = $(PREFIX)ar STRIP = $(PREFIX)strip OBJCOPY = $(PREFIX)objcopy #################################################################################### ## debug/release DEBUG ?= n DEVEL ?= n ## SDK版本 SDKVER = 3.1.2 ## iPhone的IP地址 IPHONE_IP = 10.0.2.2 ## iPhone SDK路径 IPHONESDK = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$(SDKVER).sdk ## include 路径 INCPATH += -I"$(IPHONESDK)/usr/include" INCPATH += -I"/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/gcc/arm-apple-darwin9/4.2/include/" INCPATH += -I"/Developer/Platforms/iPhoneOS.platform/Developer/usr/include/" INCPATH += -I"/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator$(SDKVER).sdk/usr/include" ## 标准库或者框架的设置 LDFLAGS= -lobjc \ -bind_at_load \ -multiply_defined suppress \ -w LDFLAGS += -framework CoreFoundation LDFLAGS += -framework Foundation LDFLAGS += -framework UIKit LDFLAGS += -framework CoreGraphics #LDFLAGS += -framework AddressBookUI #LDFLAGS += -framework AddressBook #LDFLAGS += -framework QuartzCore #LDFLAGS += -framework GraphicsServices #LDFLAGS += -framework CoreSurface #LDFLAGS += -framework CoreAudio #LDFLAGS += -framework Celestial #LDFLAGS += -framework AudioToolbox #LDFLAGS += -framework WebCore #LDFLAGS += -framework WebKit #LDFLAGS += -framework SystemConfiguration #LDFLAGS += -framework CFNetwork #LDFLAGS += -framework MediaPlayer #LDFLAGS += -framework OpenGLES #LDFLAGS += -framework OpenAL LDFLAGS += -F"$(IPHONESDK)/System/Library/Frameworks" LDFLAGS += -F"$(IPHONESDK)/System/Library/PrivateFrameworks" ## 编译开关 CFLAGS += $(INCPATH) \ -std=c99 \ -W -Wall \ -funroll-loops \ -Diphoneos_version_min=2.0 \ -Wno-unused-parameter \ -Wno-sign-compare ifeq ($(DEBUG), y) CFLAGS += -O0 -g -DDEBUG_MUTEX else CFLAGS += -O3 -DNDEBUG ifeq ($(DEVEL), y) CFLAGS += -g endif endif CFLAGS += -F"$(IPHONESDK)/System/Library/Frameworks" CFLAGS += -F"$(IPHONESDK)/System/Library/PrivateFrameworks" #################################################################################### BUILDDIR =./build/3.0 SRCDIR =./Classes RESDIR =./Resources ###///////////////////////////////////////////////////////////// ### Source files ###///////////////////////////////////////////////////////////// OBJS = $(patsubst %.m,%.o,$(wildcard $(SRCDIR)/*.m)) OBJS += $(patsubst %.m,%.o,$(wildcard ./*.m)) OBJS += $(patsubst %.c,%.o,$(wildcard $(SRCDIR)/*.c)) OBJS += $(patsubst %.cpp,%.o,$(wildcard $(SRCDIR)/*.cpp)) NIBS = $(patsubst %.xib,%.nib,$(wildcard *.xib)) RESOURCES= $(wildcard $(RESDIR)/*) APPFOLDER= $(TARGET).app .PHONY: all all: $(TARGET) bundle $(TARGET): $(OBJS) $(LD) $(LDFLAGS) -o $@ $^ %.o: %.m $(CC) -c $(CFLAGS) $< -o $@ %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ %.o: %.cpp $(CXX) -x objective-c++ $(CFLAGS) $< -o $@ %.nib: %.xib ibtool $< --compile $@ bundle: $(TARGET) @rm -rf $(BUILDDIR) @mkdir -p $(BUILDDIR)/$(APPFOLDER) @cp -r $(RESDIR)/* $(BUILDDIR)/$(APPFOLDER) @cp Info.plist $(BUILDDIR)/$(APPFOLDER)/Info.plist @echo "APPL" > $(BUILDDIR)/$(APPFOLDER)/PkgInfo mv $(NIBS) $(BUILDDIR)/$(APPFOLDER) # export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate @ldid -S $(TARGET) @mv $(TARGET) $(BUILDDIR)/$(APPFOLDER)/$(TARGET)_ install: bundle @ssh root@$(IP) "cd /Applications/$(APPFOLDER) && rm -R * || echo 'not found' " @scp -rp $(BUILDDIR)/$(APPFOLDER) root@$(IP):/Applications @ssh root@$(IP) "cd /Applications/$(APPFOLDER) ; ldid -S $(TARGET)_; killall SpringBoard" @echo "Application $(APPFOLDER) installed" uninstall: ssh root@$(IPHONE_IP) 'rm -fr /Applications/$(APPFOLDER); respring' @echo "Application $(APPFOLDER) uninstalled, please respring iPhone" install_respring: scp respring_arm root@$(IPHONE_IP):/usr/bin/respring .PHONY: clean clean: @rm -f $(OBJS) $(TARGET) @rm -rf $(BUILDDIR) |
然后执行下面的make命令,我们就可以直接在 iPhone 上测试我们的程序了。
1 2 3 |
make install_respring make make install |
相关文章
- iPhone开发之深入浅出 (2) --- ARC之@property使用 - (2012-01-04)
- iPhone开发之深入浅出 (1) --- ARC是什么 - (2012-01-01)
- iPhone开发技巧之调试篇(3)--- 程序Crash后的调试技巧 - (2011-11-06)
- iPhone开发之游戏篇(3)--- cocos2d的Actions构成 - (2010-07-05)
- iPhone开发之游戏篇(2) --- cocos2d的Actions - (2010-07-03)
- iPhone开发之游戏篇(1) --- cocos2d的基本概念 - (2010-07-01)
- iPhone开发进阶(11)--- 多线程的使用与注意事项 - (2010-03-09)
- iPhone开发进阶(10)--- 在程序中使用 GPS - (2010-03-07)
- iPhone开发进阶(9)--- 用SQLite管理数据库 - (2010-03-06)
- iPhone开发进阶(8)--- 检测屏幕触摸事件 - (2010-03-04)
- iPhone开发进阶(7)--- 利用ModalViewController切换View - (2010-03-02)
- iPhone开发进阶(6)--- 编程定制UIButton - (2010-02-27)
- iPhone开发进阶(5) --- 编程定制UIViewController - (2010-02-25)
- iPhone开发进阶(3) --- iPhone应用程序的启动过程 - (2010-02-21)
- iPhone开发进阶(2) --- iPhone应用程序/项目的构成 - (2010-02-19)
- iPhone开发进阶(1) --- 深入理解iPhone OS/SDK与Objective-C 2.0 - (2010-02-17)
- iPhone、Android、Symbian … 移动设备应用程序开发的趋势与对策 - (2010-02-14)
- 使用org-mode来GTD(3)--- iPhone中使用org-mode - (2010-02-06)
- iPhone开发入门(11)--- 在App Store上发布程序 - (2010-01-21)
- iPhone开发入门(10)--- 设备上运行程序 - (2010-01-19)
- iPhone开发入门(9)--- 实际开发中的应用技巧 - (2010-01-16)
- iPhone开发入门(8)--- 程序画面与控件调整 - (2010-01-05)
- iPhone开发入门(7)--- 从C/C++语言到Objective-C语言 - (2009-12-31)
- iPhone开发入门(6)--- Action与Objective-C - (2009-12-19)
- iPhone开发入门(5)---iPhone编程初步 - (2009-12-16)
喜欢这个文章吗?
相册
日历
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
|---|---|---|---|---|---|---|
| « 一 | ||||||
| 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 | ||||
页面
分类目录
- Emacs (4)
- org-mode (3)
- WEB2.0 (3)
- 云计算 (3)
- WordPress (1)
- 嵌入式系统 (80)
- 工作的艺术 (9)
- 敏捷开发 (2)
- 数字家电 (4)
- 家庭影院 (2)
- 未分类 (7)
博客目录
标签
云计算
嵌入式
工作的艺术
敏捷开发
数字家电
AV功放
BREW
busybox
C++
cocos2d
CPU
Debug
Emacs
Go
Google
GTD
iPad
iPhone
J2ME
linux
muse
Objective-C
Org-mode
P2P
subversion
WordPress
XML
2010年03月15日
是不是要破解的iPhone才行???
2010年03月18日
和破解没关系啊。只是最后要伪造签名,不签名在实际设备上运行不了的。
2010年12月21日
看到你的文章受益匪浅,非常感谢。希望今后可以多交流交流。
想问一下,在这里iPhone和pc是通过什么方式连接的,(是USB,还是wifi,还是其他?)
## iPhone的IP地址
IPHONE_IP = 10.0.2.2
再问一个问题,在开发中遇到一个问题,iPhone的timer应用中的时间选择控件是如何实现的,
我现在使用需要这种形式的控件,也就是通过滑动方式从多个选项中选中一个选项的。
2012年02月03日
应该是用jialbroken iPhone,否则怎么通过ssh连接上iPhone,然后拷贝程序得阿。
2012年02月06日
如何在 iPhone 上编辑 /etc/ssh/sshd_config 文件呢?iphone上又没有vi,有什么好办法么?还是说需要scp出来,编辑完之后再scp回去。