iPhone/iPod development/zh CN

From Lazarus wiki
Jump to: navigation, search

English (en) | 한국어 (ko) | 中文(中国大陆)‎ (zh_CN) | 中文(台灣)‎ (zh_TW)

安装

系统需求:

  • Intel Mac (iPhone SDK 需求)
  • Mac OS X 10.5.5 or later (iPhone SDK 需求)
  • iPhone SDK 3.x 或更高版本(调试需 2.2 - 5.1). 注意: 在iPhone SDK 3.0链接时,存在一个漏洞. 更多信息参考下文.

部分特征:

  • 模拟器支持
  • Xcode模板直接支持(实际上是需要)将Pascal和Objective-C源文件在同一应用中使用
  • Pascal语言翻译了从SDK中抽取的OpenGL ES 1.1 C语言头文件(这是我们唯一能提供的, 因为这一文件时基于SGI开源许可证), 此文件在gles11单元中

在提问之前,请阅读安装盘镜像中的ReadMe.rtf文件全文. 这一文件包含了大量的需要关注的信息(尤其是关于模拟器使用的信息),以及当需要增加Pascal源文件时,如何替换使用的模板.

请注意,与其他的FPC发布版本不同,这一安装包会安装FPC的源文件和脚本文件,并运行这些脚本来编译FPC(当你向安装文件提供了iPhone SDK的安装路径,就会自动生成所需的C语言头文件的Pascal版本). 这一做法是为了符合iPhone SDK的协议条文, iPhone SDK协议不允许发布任何的有SDK衍生产物. 如果脚本因某种原因终止,你可以在以下路径/Developer/FreePascalCompiler/2.6.0/InstallScript/finish_fpc_iphone_install.command 重新加载. 你也可以从我们的官网下载.

如果你在安装结束后运行脚本过程中出现问题,请在提问时务必提供脚本所运行的完整终端截屏。

(Xcode 4兼容性问题: Xcode模板只在Xcode 3上运行, 而不能在Xcode 4上运行.)

iPhone SDK 3.0

iPhone SDK 3.0在链接过程中会出现一个由包含了FPC的Xcode模板引发的错误. 你可以通过在创建设置中的"其他链接器"中加入链接信息"-Wl,-no_order_inits"来回避这一错误. 这一修正已包含在了上文2.4.0rc1的链接中,但是你如果使用之前版本的模板,可能需要手动修改.

这个链接错误已经向苹果报告了(rdar://problem/7120987). 这一错误已经在Xcode4中修复.

Xcode 4, iOS SDK 5.0, Objective-Pascal

关于Xcode 4模板和在iOS上用Objective-Pascal编程,请参阅http://dl.dropbox.com/u/28343282/ObjP/index.html

苹果许可证限制

iPhone/iPod应用开发

FPC并不能回避苹果发布的对于iPhone/iPod Touch开发程序的要求.因此开发者必须注册一个苹果iPhone开发者项目账户(美元$99/年)来对真是硬件做FPC编译程序的开发(与常规的Xcode编译程序项目).

如果没有此许可,开发者只可以在模拟器上运行程序(也可能在已越狱的iPhone/iPod Touch上运行,但是这只限于自有设备).

关于苹果iPhone开发项目的更多信息,请参阅: http://developer.apple.com/iphone/program/

开发所需的Pascal单元

发布iPhone SDK衍生品是违反iPhone SDK协议的,这包括了Pascal语言对于框架头文件的翻译版本.因此,如何在发布包括了GUI的纯Pascal程序同时,又遵守苹果iPhone SDK协议是一项巨大的挑战.更多信息,请参阅ReadMe.rtf(包含在上文的.dmg镜像文件中).

开发中的技术局限

至今,我们还无从得知是否能够将应用复制到iPhone/iPod Touch上并执行而无须使用Xcode. 但毋庸置疑的是可以在任何IDE(Lazarus, Lightweight IDE等)上开发iPhone/iPod Touch,并在模拟器上运行.但是所有的应用必须在Xcode上传见以加载到iPhone/iPod Touch设备上并在设备上调试.

iPhone模拟器与iPhone的不同

iPhone模拟器让iPhone操作系统API能够被一般的Mac应用使用,从而模拟设备所能提供的环境.通过允许在Mac系统上运行应用,模拟器提供了一种无需设备的快速应用调试功能.但是,在模拟器上运行并不等同于在设备上运行.

模拟器使用的是低层的Mac系统版本的iPhone操作系统框架,而非设备所使用的版本.总体而言,模拟器是一个优秀的工具来进行初步的调试工作.但是必须谨记,因为模拟器不能模拟设备的功能,必须在真实设备上对于引用进行最终调试以及运行效果分析.这样做的主要原因在于在模拟器是运行的程序可以直接使用其他Mac系统的框架与功能,而这些框架与功能是iPhone/iPod Touch设备所没有的.

在iPhone/iPod Touch上编译和运行纯Pascal应用

纯命令行应用能够在iPhone/iPod Touch上运行,除非输出结果只在gdb控制台(如果通过Xcode进行运行和调试,按cmd-shift-r或选择Run->Console)或设备的控制台日志(如果在iPhone/iPod Touch上执行)上可见.对于图形用户界面应用,需要用到上文中提到的由于协议而不能发布的头文件翻译.当然,也可以使用自定义的C头文件Pascal翻译(最好是使用自动工具创建).

仅使用Xcode

  1. 由模板创建新的项目
  2. 从项目中移除除*Prefix.pch, Info.plist外的所有文件、框架和产品
  3. 添加新的Pascal原文件 (Project->Add to Project...)
  4. 双击在左上角的Xcode文件列表中的项目图标,进入Build标签,修改FPC_MAIN_FILE设置为所新添加的测试程序的文件名.
  5. 创建程序

使用编译指令和Xcode

如果你已经使用命令行编译程序(使用Darwin/ARM),将产生的二进制文件复制到Xcode项目中,并在Xcode中运行运行此程序,Xcode将会调用运行这一二进制文件而非原程序(这样仅仅是为了保证Xcode所使用的是最新的原程序,而无需Xcode对其再次连接).你可以使用项目的默认模板实现这一功能,而无需对项目进行进一步设置.

你可以在项目视图中打开Products文件夹找到Xcode的二进制文件,右键单击(或ctrl+单击).app文件,选择"Reveal in Finder". 二进制文件的目录即program.app/Contents/MacOS(将program.app替换为当前目录). 将MacOS文件夹中的全部文件替换为你所编译的二进制文件(可以使用命令行命令cp).

对Darwin/ARM程序进行编译的命令行命令(将本节中的"Developer"替换为SDK的安装目录):

对FPC 2.6.0:

ppcarm -Cparmv6 -Cfvfpv2 -FD/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin -XR/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk program.pas

对iPhone模拟器 (使用上文中说明的OS_TARGET)

ppc388 -Tiphonesim  -XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk program.pas

对FPC 2.6.0之前版本:

ppcarm -FD/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin -XR/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk program.pas

对iPhone模拟器

ppc388  -XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk program.pas

在iPhone模拟器上编译和运行纯Pascal应用

在模拟器上编译和连接需要ppc386编译器. 对于iPhone模拟器和Mac系统应用之间仅有些许不同,主要体现在iPhone的Sim应用需要连接到不同与Mac应用的的构架上.

上文已经介绍了FPC 2.6.0编译iphonesim应用. 对于SDK 3.2,需要更高版本的FPC包对iphonesim目标文件进行编译(参阅 #17470). 原因: 这种情况下的FPC编译没有较大改变(i386目标文件),但是Objective-C ABI不同.对于Darwin-i386程序FPC使用ObjC1(与OSX10.4以及更早版本兼容),同时iPhonesim-i386仅使用ObjC2.(较早的iPhoneSim SDK 2.x和3.0允许使用ObjC1)

一些构架师iPhone专有的(UIKit),另一些兼容Mac OS X和iOS(CoreFoundation, CoreGraphics等).iPhoneSim SDK提供这些构架的独立版本.为了确保这些构架的SDK版本能够使用,你需要向编译器说明需要的SDK版本(与编译运行在设备上的应用时一样):

 fpc simtest.pas -XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk

此处 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk 是iPhoneSim SDK的跟目录. 你的iPhone SDK安装路径决定了此目录的位置.

目前,至少有3个版本的iPhone SDK: 2.2.1, 3.0, 3.1.根据你需要的不同版本,路径分别修改为(以上为3.0):

  • SDK version 2.2.1: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.2.1.sdk
  • SDK version 3.0: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk

等.

安装ARM交叉编译器

可下载的FPC/iPhone包包括了一个名为ppcarm的交叉编译器用来传见iPhone应用.如果你希望使用SVN中最新版本的编译器和单元,你可以按如下步骤操作:

需求: iOS SDK必须已通过标准Xcode开发工具安装,并且安装路径上没有空格.

1) 复制/Developer/FreePascalCompiler/2.6.0/Source/rtl/darwin/arm/sig_cpu.inc(这个文件会在安装FPC iPhone SDK集成开发包后自动生成)到你的SVN本地rtl/darwin/arm目录.

2) 在你的SVN目录的FPC顶层目录中执行如下命令(替换第一行中的/Developer为你的iPhone SDK安装目录,第二行中的iPhoneOS4.2.sdk为你需要使用的SDK版本):

 export IPHONEPLATFORMBASEDIR=/Developer/Platforms/iPhoneOS.platform/Developer
 make FPC=/usr/local/lib/fpc/2.6/0/ppc386 CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS4.2.sdk/ -ap -Cfvfpv2" all

3) 安装(如上,替换SDK目录和版本号):

 sudo make FPC=`pwd`/compiler/ppcrossarm OPT="-ap" CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS4.2.sdk/ -ap" install CROSSINSTALL=1
 sudo ln -sf ../lib/fpc/2.5.1/ppcrossarm /usr/local/bin/ppcarm

(可以在"sudo make"命令的最后加上"INSTALL_PREFIX=xyz"参数来将文件安装到任意的"xyz"目录下,而非/usr/local目录.这种情况下,需要修改"sudo ln"命令的路径).

更多信息

参考信息