http://www.yifeiyang.net/iphone-development-introduction-3-linux-development-environment-on-the-build-iphone-os3-1-2/
我们介绍了开发iPhone应用程序标准的环境配置是基于intel Mac的。虽说现在Mac很便宜,但是仍然大部分人仍然在用windows和linux系统,今天就介绍一下在linux上建立iPhone开发系统。这里采用最新的SDK版本3.1.2(截至到2009/12/01)。
这回主要介绍linux下的安装,配置方法,windows(Cygwin)的配置可以参考这里。
我的HOST机器环境如下:
1 2 3 4 5 6 7 8 9 |
$ uname -a Linux localhost.localdomain 2.6.18-1.2798.fc6 #1 SMP Mon Oct 16 14:54:20 EDT 2006 i686 i686 i386 GNU/Linux $ gcc -v Using built-in specs. Target: i386-redhat-linux config option: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux thread model: posix gcc version 4.1.2 20070626 (Red Hat 4.1.2-13) |
需要准备的东东:
许多网站都介绍过了,这里也使用 toolchain 来建立环境。参考 iphonedevonlinux 。
1 2 3 4 5 6 7 8 |
$ mkdir ~/toolchain $ cd ~/toolchain $ svn checkout http://iphonedevonlinux.googlecode.com/svn/trunk/ ./ # 拷贝SDK,firmware文件 $ mkdir -p files/firmware $ mv ./iphone_sdk_3.1.2_with_xcode_3.1.4__leopard__9m2809.dmg ./files/ $ mv ./iPhone1,2_3.1.2_7D11_Restore.ipsw ./files/firmware/ |
因为checkout 下来的toolchain是针对3.0版本的,直接不能使用,所以需要打个补丁。这里下载补丁,然后在toolchain目录下:
1 2 |
$ patch < toolchain.sh.patch
$ chmod u+x toolchain.sh |
本来执行 ./toolchain.sh all 后会全部给安装和编译的,但是实际上有很多问题,所以我们还是一步一步地来。
1 2 3 4 5 6 7 8 |
# 第一步没有什么问题 $ ./toolchain.sh headers # 第二步也顺利通过 $ ./toolchain.sh firmware # 第三步也挺顺利 $ ./toolchain.sh darwin_sources # 最后一步,这一步需要注意了 $ ./toolchain.sh build |
执行最后一步编译gcc-4.2-iphone,在链接的时候会出现以下的错误:
1 2 3 4 5 6 7 8 9 10 |
ld: library not found for -lc collect2: ld returned 1 exit status make[3]: *** [libgcc_s.dylib] error 1 .... make[2]: *** [stmp-multilib] error 2 rm gcov.pod fsf-funding.pod gfdl.pod gpl.pod cpp.pod gcc.pod .... make[1]: *** [all-gcc] error 2 make[1]:leaving dir `/home/xxx/toolchain/toolchain/bld/gcc-4.2-iphone' make: *** [all] error 2 |
解决它很简单,在toolchain目录下执行:
cp ./sdks/iPhoneOS3.1.2.sdk/usr/lib/libSystem.B.dylib ./toolchain/bld/gcc-4.2-iphone/gcc/libc.dylib
接下来在执行一次 ./toolchain.sh build 就可以了。最后出现下面的画面就是成功了。
It seems like the toolchain built!
最后你可以执行 ./toolchain.sh clean 删除编译过程中的文件和 SDK 等文件,你也可以不这么做。
接下来,借可以先试试 toolchain/apps/ 下面的测试代码 HelloToolchain。
1. 找不到编译器文件 arm-apple-darwin9-gcc
如果直接在HelloToolchain目录下 make。很可能提示,没有 arm-apple-darwin9-gcc 等命令。这是因为没有设置编译器路径的原因。将下面的语句放入 /etc/profile 内(针对所有用户),或者 .bash_profile 文件中就可以了。
export PATH=/home/xxx/toolchain/toolchain/pre/bin:$PATH
2. 编译过程中提示Frameworks,或头文件找不到
Classes/ClockAppDelegate.m:10:38: error: AVFoundation/AVFoundation.h: no such file or directory
make: *** [Classes/ClockAppDelegate.o] Error 1
或者是连接的时候提示:
ld: library not found for -lobjc
collect2: ld returned 1 exit status
make: HelloWorldFirst? Error 1
首先检查你的makefile文件是否配置好了库文件和头文件路径,比如像是以下的设置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
# iPhone SDK path IPHONESDK = /home/xxx/toolchain/toolchain/sys # include path (SDK) INCPATH += -I"$(IPHONESDK)/usr/include" # include path (gcc) INCPATH += -I"$(IPHONESDK)/usr/include/gcc/darwin/4.2" CFLAGS += $(INCPATH) / ... LDFLAGS += -L"$(IPHONESDK)/usr/lib" LDFLAGS += -F"$(IPHONESDK)/System/Library/Frameworks" LDFLAGS += -F"$(IPHONESDK)/System/Library/PrivateFrameworks" CFLAGS += -F"$(IPHONESDK)/System/Library/Frameworks" CFLAGS += -F"$(IPHONESDK)/System/Library/PrivateFrameworks" |
如果还是不行,下面有两个方法让你得到最新(3.1.2)的版本库和头文件:
在这里下载dyldcache,用scp等工具将其传送到iPhone上,然后执行:
iPhone$ ./dyldcache /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv6
大概解压后有4GB左右的文件,请注意iPhone剩余的容量大小。解压完毕后将 ./out 目录下的文件拷贝到linux上的./toolchain/sys/usr/lib 目录下。
如果你还没有iPhone设备,那么可以按照以下的方法由sdk文件中提取库文件。
1. 在这里下载HFSExplorer工具。(windows下使用)
2. 用HFSExplorer打开SDK文件(.dmg文件),在Packages目录下将iPhoneSDKHeadersAndLibs.pkg文件解压到某一目录下。然后拷贝到linux下,比如这里拷贝到/tmp下。
3. 执行以下命令,加压该数据包:
1
2
3 |
$ cd /tmp
$ xar -xf iPhoneSDKHeadersAndLibs.pkg Payload
$ zcat Payload | cpio -i |
完成之后,在/tmp目录下会生成几个子目录,这里我们需要的是Platforms目录下的东东。将 ./Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.2.sdk 目录与其子目录拷贝到toolchain的sdks目录下就可以了。
1 |
$ cp -rp ./Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.2.sdk /home/xxx/toolchain/sdks/ |
注意 toolchain/sdks/ 目录下已经有 iPhoneOS3.1.2.sdk 目录了,完整覆盖它。通过以上修改后,刚才的 makefile 中的SDK路径需要修改一下,像是下面的样子。
1
2
3 |
# iPhone SDK path IPHONESDK = /home/xxx/toolchain/sdks/iPhoneOS3.1.2.sdk ... |
接下来,可以编译一下自己的程序,上机测试了。别忘了用ldid签名哦!。比如HelloToolchain是:
1 |
ldid -S HelloToolchain_ |
toolchain for iPhone SDK 3.1.2