网上搭建iPhone开放开发环境的文章已经不少了。本文参考了不少资料,详细说明如何成功在Leopard中搭建一个完整的开发环境并整合XCode进行iPhone源生程序的开发。
在XCode中整合toolchain开发环境和苹果官方的iPhone SDK并不冲突,你可以在同一个XCode中既建立toolchain的开发工程,也可以建立官方的iPhone SDK工程。
本文在Leopard 10.5.2,XCode 3.1 Beta 3(随iPhone SDK Beta3提供),iPhone OS 1.1.4测试通过。
准备工作
请确认操作系统为Leopard 10.5.2。
请确认XCode已经安装。最好安装最新的官方XCode 3.1 Beta。
手中最好是有iPhone或者iPod Touch, 已经jailbreak。
获取toolchain源码
打开一个terminal窗口,随便建立一个目录
-
mkdir iphoneenv
-
cd iphoneenv
后面的操作都在这个目录中进行,只需复制下文文字框中的内容,贴到terminal窗口执行即可。
获取源码
-
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm-svn -r 42498
-
pushd llvm-svn
-
./configure –enable-optimized
-
make ENABLE_OPTIMIZED=1
-
sudo make install
-
LLVMOBJDIR=`pwd`
-
popd
获取iphone-dev SVN代码库
-
svn checkout http://iphone-dev.googlecode.com/svn/trunk/ iphone-dev
-
pushd iphone-dev
建立一个保存toolchain的目录。
-
sudo mkdir /usr/local/arm-apple-darwin
编译odcctools
-
mkdir -p build/odcctools
-
pushd build/odcctools
-
../../odcctools/configure –target=arm-apple-darwin –disable-ld64
-
export INCPRIVEXT="-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
-
make
-
sudo make install
-
popd
获取iPhone中的框架和头文件
获取这个iPhone的镜像有很多办法,这里介绍几种:
最省事的办法(如果手头没有iPhone或是没有wi-fi):
在google搜索iphone_image,找到了就直接下载,解压缩。
麻烦点的办法(手头有jailbreak并安装了installer的iPhone或者iPod Touch):
如果你家里或者单位有wi-fi,而且iPhone已经连上w-ifi,直接在iPhone的Installer里找到BSD Subsystem和OpenSSH并安装,然后用scp把iPhone里面从根目录开始的所有子目录的所有的文件拷贝出来。
或者在installer里安装AFPd,然后用Finder打开afp://你的iphone的ip地址,用户名用root, 密码用alpine,把里面的所有文件直接拽出来。
详细方法不介绍了,相信你一定能搞定。
复制镜像
假设你把这个镜像里的所有文件都放在/iphone_image目录,那么执行下面操作(不要离开terminal的当前目录):
-
sudo mkdir /usr/local/share/iphone-filesystem
-
sudo cp -Rp /iphone_image/* /usr/local/share/iphone-filesystem/
设置$HEAVENLY的环境变量
-
HEAVENLY=/usr/local/share/iphone-filesystem
-
pushd include
-
./configure –with-macosx-sdk=/Developer/SDKs/MacOSX10.4u.sdk
-
sudo bash install-headers.sh
-
popd
安装csu
-
mkdir -p build/csu
-
pushd build/csu
-
../../csu/configure –host=arm-apple-darwin
-
sudo make install
-
popd
configure和make LLVM-GCC
-
mv llvm-gcc-4.0-iphone/configure llvm-gcc-4.0-iphone/configure.old
-
sed 's/^FLAGS_FOR_TARGET=$/FLAGS_FOR_TARGET=${FLAGS_FOR_TARGET-}/g' llvm-gcc-4.0-iphone/configure.old > llvm-gcc-4.0-iphone/configure
-
sudo ln -s /usr/local/arm-apple-darwin/lib/crt1.o \/usr/local/arm-apple-darwin/lib/crt1.10.5.o
-
mkdir -p build/llvm-gcc-4.0-iphone
-
pushd build/llvm-gcc-4.0-iphone
-
export FLAGS_FOR_TARGET="-mmacosx-version-min=10.1"
-
sh ../../llvm-gcc-4.0-iphone/configure –enable-llvm=`llvm-config –obj-root` \
-
–enable-languages=c,c++,objc,obj-c++ –target=arm-apple-darwin –enable-sjlj-exceptions \
-
–with-heavenly=$HEAVENLY –with-as=/usr/local/bin/arm-apple-darwin-as \
-
–with-ld=/usr/local/bin/arm-apple-darwin-ld
-
make LLVM_VERSION_INFO=2.0-svn-iphone-dev-0.3-svn
-
sudo make install
-
popd
-
popd
这样,专门用来编译iPhone的toolchain gcc就编译完了,文件位置在:
-
/usr/local/bin/arm-apple-darwin-gcc
整合XCode
接下来,整合XCode:
下载XCode模板。
解压缩,把
-
iPhone UIKit Skeleton Application
这个文件夹复制到
-
/Developer/Library/XCode/Project Templates/Application/
好了,打开XCode,新建一个项目,你会发现列表里已经出现了
iPhone UIKit Skeleton Application
这样一个模板(不在iPhone OS分类里而是在Mac OS X分类)
直接创建项目,取个名字, 直接编译,成功。
建议你使用本文的方法编译toolchain,而不是直接下载别人编译好的安装包,这样问题会少很多。
如果你下载了其他地方的例子,可能需要修改Makefile才可以编译成功。尤其是google code的iPhone代码。
比如:
你需要把
-
CC=/usr/local/arm-apple-darwin/bin/gcc
改成:
-
CC=/usr/local/bin/arm-apple-darwin-gcc -v
把
-
CC=/usr/local/arm-apple-darwin/bin/g++
改成:
-
CXX=/usr/local/bin/arm-apple-darwin-g++
把LDFLAGS里的
-
-Wl,-syslibroot,/usr/local/arm-apple-darwin/heavenly
直接删掉。
好了,这样,你的开发环境就搭建完了。
参考文档
http://wikee.iphwn.org/howto:toolchain_on_leopard
http://www.iphonetw.net/?q=books/unofficialdev/osxbuildtoolchain
http://www.cocoamachine.com/blog/2008/01/make-your-own-native-iphone-ap.html
20 Responses for "在Leopard中编译搭建非官方iPhone toolchain开发环境并整合到XCode"
读者请注意这里有个问题:
这种 – 需要替换成两个减号。
另外由于fckeditor的bug,
export INCPRIVEXT=
后面的 " 要替换成引号。
感谢Cocoa China提供的文档,我已经在macbook上完成了整合操作!并且建立了iPhone UIKit Skeleton Application项目,并编译通过.
有个问题不明白:
在Xcode中用iPhone UIKIT.. 模板建立的项目中对Foundation.framework和 UIKit.framework 的引用显示红色,我查了其中一个的信息,其地址为:/Developer/SDKs/iPhone.sdk/System/Library/Frameworks/Foundation.framework 而在
我的系统中SDKs目录下并没有iPhone.sdk这个目录,不知道是我操作的不正确,还是本来就是这样的?
显示红色是正常的。只要Makefile里的LDFLAGS有-framework UIKit , -framework Foundation就能编过去。能编过去就可以在iPhone上跑
(执行之前要先修改权限,比如myproject,需要
cd /Applications/myproject.app/
然后
chmod +x myproject
然后
killall SpringBoard,重启SpringBoard 这样就可以执行,直接通过ssh也可以执行,但是不通过SpringBoard启动的话,重力感应是没有的,语言会被识别为英语)
多谢回答!
找不到dylib1.10.5.o是怎么回事啊
/usr/local/bin/arm-apple-darwin-ld: warning unknown -macosx_version_min parameter value: 10.5.0 ignored (using 10.1)
/usr/local/bin/arm-apple-darwin-ld: can’t open: non-weak (No such file or directory, errno = 2)
/usr/local/bin/arm-apple-darwin-ld: can’t locate file for: -ldylib1.10.5.o
ashong请问这是走到哪步出现的问题?
[quote]
gagaga 05月 5th, 2008 at 11:07 am 6
ashong请问这是走到哪步出现的问题?
[/quote]
make LLVM_VERSION_INFO=2.0-svn-iphone-dev-0.3-svn
把这一行
sudo ln -s /usr/local/arm-apple-darwin/lib/crt1.o \/usr/local/arm-apple-darwin/lib/crt1.10.5.o
改为两行
sudo ln -s /usr/local/arm-apple-darwin/lib/crt1.o /usr/local/arm-apple-darwin/lib/crt1.10.5.o
sudo ln -s /usr/local/arm-apple-darwin/lib/dylib1.o /usr/local/arm-apple-darwin/lib/dylib1.10.5.o
重新configure,编译就可以了
一步一步做完之后尝试编译 iPhoneTextReader 时遇到以下错误:
error: WebCore/WebFontCache.h: No such file or directory
怎么会这样?难道是什么东西的版本不对?
编译例子有时候会有一些问题:GraphicsServices、WebCore这两个都可能会有一点问题,主要是iphone-dev提供的.h文件缺少一些东西。整理一下会放上来。
我也碰到error: WebCore/WebFontCache.h: No such file or directory错误了.
我在网上找到WebFontCache.h的代码了.
/*
* class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2006 by Steve Nygard.
*/
#import
@interface WebFontCache : NSObject
{
}
+ (struct __GSFont *)createFontWithFamily:(id)fp8 traits:(unsigned int)fp12 size:(float)fp16;
自己添加一下就可以编译通过了.
尖括号被屏蔽砳 import改如下
#import <Foundation/NSObject.h>
其实webcore唯一的用处就是创建字体。不过还缺一些别的文件,rainday可以看下最新的一篇,我放了一个header包:)
大家好 谁能给我一个XCodeiPhoneTemplate.zip ,那个XCode摸板,网站已经被关闭了我的Email是mikejiang@vip.sina.com或者mikejiang79@hotmail.com谢谢啦
我按照LZ办法做到”编译odcctools”中的make这一步时出现了这个错误,我的是10.5.3,最新版的SDK,我不知道它的版本号时多少,我在一个国外的网站上发现了一个方法,说先做export INCPRIVEXT=”-isysroot /Developer/SDKs/MacOSX10.4u.sdk”;或FORHDRS=”-isysroot /Developer/SDKs/MacOSX10.4u.sdk”,然后再configure ,make,依然没有解决我的问题,请高手指教阿!
cd libstuff && make
gcc -Wall -Wno-long-double -Wno-import -DHAVE_CONFIG_H -I..//include -I../../../odcctools/include -g -O2 -fno-builtin-round -fno-builtin-trunc -no-cpp-precomp -mdynamic-no-pic -c -o allocate.o ../../../odcctools/libstuff/allocate.c
gcc -Wall -Wno-long-double -Wno-import -DHAVE_CONFIG_H -I..//include -I../../../odcctools/include -g -O2 -fno-builtin-round -fno-builtin-trunc -no-cpp-precomp -mdynamic-no-pic -c -o errors.o ../../../odcctools/libstuff/errors.c
gcc -Wall -Wno-long-double -Wno-import -DHAVE_CONFIG_H -I..//include -I../../../odcctools/include -g -O2 -fno-builtin-round -fno-builtin-trunc -no-cpp-precomp -mdynamic-no-pic -c -o arch.o ../../../odcctools/libstuff/arch.c
gcc -Wall -Wno-long-double -Wno-import -DHAVE_CONFIG_H -I..//include -I../../../odcctools/include -g -O2 -fno-builtin-round -fno-builtin-trunc -no-cpp-precomp -mdynamic-no-pic -c -o execute.o ../../../odcctools/libstuff/execute.c
In file included from ../../../odcctools/include/libkern/OSByteOrder.h:70,
from ../../../odcctools/include/mach/ndr.h:94,
from ../../../odcctools/include/mach/clock_priv.h:7,
from ../../../odcctools/include/mach/mach_interface.h:37,
from ../../../odcctools/include/mach/mach.h:62,
from ../../../odcctools/libstuff/execute.c:25:
../../../odcctools/include/libkern/machine/OSByteOrder.h:45: error: redefinition of ‘_OSSwapInt16’
/usr/include/libkern/i386/_OSByteOrder.h:49: error: previous definition of ‘_OSSwapInt16’ was here
../../../odcctools/include/libkern/machine/OSByteOrder.h:54: error: redefinition of ‘_OSSwapInt32’
/usr/include/libkern/i386/_OSByteOrder.h:58: error: previous definition of ‘_OSSwapInt32’ was here
../../../odcctools/include/libkern/machine/OSByteOrder.h:63: error: redefinition of ‘_OSSwapInt64’
/usr/include/libkern/i386/_OSByteOrder.h:69: error: previous definition of ‘_OSSwapInt64’ was here
make[1]: *** [execute.o] Error 1
make: *** [libstuff] Error 2
-bash: -mmacosx-version-min=10.1: command not found
10.5.3的版本,出现这个问题是否由于版本的关系?
上个问题以解决,改成 FLAGS_FOR_TARGET=”-mmacosx-version-min= 10.1″。
在make LLVM_VERSION_INFO=2.0-svn-iphone-dev-0.3-svn的时候,出现这个错误:
error: cannot execute: /usr/local/bin/arm-apple-darwin-ld: check –with-ld or env. var. DEFAULT_LINKER
在执行sudo make install时,出现:
/usr/bin/install -c mkheaders /usr/local/libexec/gcc/arm-apple-darwin/4.0.1/install-tools/mkheaders
make[1]: *** No rule to make target `install’. Stop.
make: *** [install-gcc] Error 2
啥都不說樂, 強帖留名!!
Building target “Untitled” of project “Untitled” with configuration “Release” — (1 error)
cd /Users/Wahaha/Documents/MyCodes/Untitled
/usr/bin/make
mkdir -p /Users/Wahaha/Documents/MyCodes/Untitled/build/Untitled.build/Release-iphoneos/
/usr/local/bin/arm-apple-darwin-gcc -g -O2 -Wall -c /Users/Wahaha/Documents/MyCodes/Untitled/UntitledApp.m -o /Users/Wahaha/Documents/MyCodes/Untitled/build/Untitled.build/Release-iphoneos/UntitledApp.o
make: /usr/local/bin/arm-apple-darwin-gcc: Command not found
make: *** [/Users/Wahaha/Documents/MyCodes/Untitled/build/Untitled.build/Release-iphoneos/UntitledApp.o] Error 127
make: *** [/Users/Wahaha/Documents/MyCodes/Untitled/build/Untitled.build/Release-iphoneos/UntitledApp.o] Error 127
make: *** [/Users/Wahaha/Documents/MyCodes/Untitled/build/Untitled.build/Release-iphoneos/UntitledApp.o] Error 127
make: *** [/Users/Wahaha/Documents/MyCodes/Untitled/build/Untitled.build/Release-iphoneos/UntitledApp.o] Error 127
make: *** [/Users/Wahaha/Documents/MyCodes/Untitled/build/Untitled.build/Release-iphoneos/UntitledApp.o] Error 127
make: *** [/Users/Wahaha/Documents/MyCodes/Untitled/build/Untitled.build/Release-iphoneos/UntitledApp.o] Error 127
Build failed (1 error)
————————
貌似主要是这句make: /usr/local/bin/arm-apple-darwin-gcc: Command not found
我查看了这个目录 的确没有arm-apple-darwin-gcc,我都是按您的步骤来的,不知道哪里错了…..请提供一个修补方案,万分感谢!!!!
发表评论