作者:易飛揚
第一回:http://www.bkjia.com/kf/201110/107927.html我們介紹了開發iPhone應用程式標準的環境配置是基於intel Mac的。雖說現在Mac很便宜,但是仍然大部分人仍然在用windows和linux系統,今天就介紹一下在linux上建立iPhone開發系統。這裡採用最新的SDK版本3.1.2(截至到2009/12/01)。
這回主要介紹linux下的安裝,配置方法,windows(Cygwin)的配置可以參考這裡。
我的HOST機器環境如下:
$ 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)
需要準備的東東:
3.1.2用restore file iPhone1,2_3.1.2_7D11_Restore.ipsw
iPhone3.1.2 SDK iphone_sdk_3.1.2_with_xcode_3.1.4__leopard__9m2809.dmg
許多網站都介紹過了,這裡也使用 toolchain 來建立環境。參考 iphonedevonlinux 。
checkout toolchain
$ 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/
今天(2010/2/9)更新的toolchain已經對應3.1.2版本的SDK了,所以大家不用再給他打補丁了。(多謝網友wzhao)
※ 如果遇到"We need the decryption key for 018-6028-014.dmg."的問題,可以將toolchain.sh中的
DECRYPTION_KEY_SYSTEM=$..... 替換為 DECRYPTION_KEY_SYSTEM="a8a886d56011d2d98b190d0a498f6fcac719467047639cd601fd53a4a1d93c24e1b2ddc6"
因為checkout 下來的toolchain是針對3.0版本的,直接不能使用,所以需要打個補丁。這裡下載補丁,然後在toolchain目錄下:
$ patch < toolchain.sh.patch
$ chmod u+x toolchain.sh
安裝/編譯
本來執行 ./toolchain.sh all 後會全部給安裝和編譯的,但是實際上有很多問題,所以我們還是一步一步地來。
# 第一步沒有什麼問題
$ ./toolchain.sh headers
# 第二步也順利通過
$ ./toolchain.sh firmware
# 第三步也挺順利
$ ./toolchain.sh darwin_sources
# 最後一步,這一步需要注意了
$ ./toolchain.sh build
執行最後一步編譯gcc-4.2-iphone,在連結的時候會出現以下的錯誤:
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:$PATH2. 編譯過程中提示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檔案是否配置好了庫檔案和標頭檔路徑,比如像是以下的設定:
# 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)的版本庫和標頭檔:
方法1
在這裡下載dyldcache,用scp等工具將其傳送到iPhone上,然後執行:
iPhone$ ./dyldcache /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv6大概解壓後有4GB左右的檔案,請注意iPhone剩餘的容量大小。解壓完畢後將 ./out 目錄下的檔案拷貝到linux上的./toolchain/sys/usr/lib 目錄下。
方法2
如果你還沒有iPhone裝置,那麼可以按照以下的方法由sdk檔案中提取庫檔案。
1. 在這裡下載HFSExplorer工具。(windows下使用)
2. 用HFSExplorer開啟SDK檔案(.dmg檔案),在Packages目錄下將iPhoneSDKHeadersAndLibs.pkg檔案解壓到某一目錄下。然後拷貝到linux下,比如這裡拷貝到/tmp下。
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路徑需要修改一下,像是下面的樣子。
# 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