YIFEIYANG 易飞扬的博客

23二/105

iPhone开发进阶(4) — 使用Makefile自动编译iPhone程序

  • 博主:易飞扬
  • 原文链接 : http://www.yifeiyang.net/iphone-development-advanced-4-use-the-makefile-to-compile-iphone-program-automatically/
  • 转载请保留上面文字。


  • 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

    相关文章

    喜欢这个文章吗?

    考虑订阅我们的RSS Feed吧!

    评论 (5) 引用 (0)
    1. 是不是要破解的iPhone才行???

    2. 和破解没关系啊。只是最后要伪造签名,不签名在实际设备上运行不了的。

    3. 看到你的文章受益匪浅,非常感谢。希望今后可以多交流交流。

      想问一下,在这里iPhone和pc是通过什么方式连接的,(是USB,还是wifi,还是其他?)

      ## iPhone的IP地址
      IPHONE_IP = 10.0.2.2

      再问一个问题,在开发中遇到一个问题,iPhone的timer应用中的时间选择控件是如何实现的,
      我现在使用需要这种形式的控件,也就是通过滑动方式从多个选项中选中一个选项的。

    4. 应该是用jialbroken iPhone,否则怎么通过ssh连接上iPhone,然后拷贝程序得阿。

    5. 如何在 iPhone 上编辑 /etc/ssh/sshd_config 文件呢?iphone上又没有vi,有什么好办法么?还是说需要scp出来,编辑完之后再scp回去。


    发表评论


    还没有引用.














    相册

    日历

    2012年二月
    « 一    
     12345
    6789101112
    13141516171819
    20212223242526
    272829  

    页面

    分类目录

    博客目录

    标签




    free counters