通常,程序是在一台计算机上编译,然后再分布到将要使用的其他计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做 交叉编译。 除了兼容性这个明显的好处之外,交叉编译还由于以下两个原因而非常重要:
在这篇文章中,我将使用手持计算机的 Sharp Zaurus系列作为焦点,讨论交叉编译环境的初始设置。我将介绍工具的安装、基本编译问题、如何在手持计算机上安装程序,以及像创建使用 首先,我将给出交叉编译的一个简洁的概览。 理解交叉编译如果您熟悉交叉编译环境,则可以跳过这一节。但是如果不了解交叉编译,则请继续往下阅读。 我使用的开发系统是 x86 体系结构的 Linux 系统。我在 SuSE Linux 8.2上测试了这些指令。测试的目标系统是 Sharp Zaurus SL-5600 和 C700。本文假设您具有 Unix 开发实践的工作背景,并使用过命令行。 正如我前面提到的,当编译器运行在一个为另一个系统产生可执行程序的系统上而且两个系统使用不同的操作环境时就会出现交叉编译。另外,当目标系统不具有它自己的编译工具时,或者当开发者可以平衡主机系统潜在更好的性能或更多的资源时,交叉编译是有用的。 当提到交叉编译器时,我不仅仅是指将一种编程语言的代码转换成对象代码的软件,还指其他必要的开发工具:
例如,strings 实用工具(它输出对象模块的文本字符串)可能是有用的,但是主机环境版本对目标环境二进制系统并不怎么有用。Zaurus 的交叉开发工具中包含 strings。 在 Zaurus上本地运行编译器是可能的,但是系统的局限性阻碍有效的工作,这也是使交叉编译为开发者带来福音的另一个原因。典型台式机的显示器和键盘非常有利于编辑工作。另外,台式机的内存、处理器和存储容量也更能满足编译的资源需要。 现在,让我们来安装所需的工具。 可用的开发工具Java 技术。Zaurus 的两个特定于 Java 的开发工具包含一个关于 Zaurus的 Java 编程和 ZaurusBuilder 的 PDF 指南。ZaurusBuilder 是一个 JBuilder IDE 插件向导,负责将 Java应用程序打包成一个 IPK 分布文件以进行安装。Zaurus Java FAQ 回答有关使用 Java 进行Zaurus 开发的问题。 Qt/C++。 Qt 是一个 C++ 工具包,用于为 PDA 创建图形用户界面。这里的产品包括一个 Qtopia 的开放源代码 SDK(一个可移动的应用环境)、一个用于设置和使用Qt/E(嵌入的 C++ 工具包)和 Qtopia 的 PDF 编程指南,以及免费版本的 Qt/E。 Linux。Zaurus 源代码是 Embedix Plus 和 Qtopia 环境。Embedix Plus 集成了来自 Lineo 的 Embedix Linux(内核2.4.x)、来自 Trolltech 的 Qt/Embedded GUI 应用框架、来自 Opera 的 Opera Web 浏览器和来自Insignia 的 Jeode JVM。还有一篇 how-to 文章,向您展示如何设置 Linux 交叉编译器。另外还有 Zaurus 上的 Linux命令的开放源代码,以及一个到利用 Linux 对 Zaurus 进行开发的参考资料的链接。 OpenZaurus 项目。OpenZaurus项目背后的初始目的是创建一个 ROM 映象(内核 + root 文件系统),这更接近于开发者想要的。该项目使用 Sharp ROM作为基础,然后再进行改造、修复 bug、添加和减少条目,以使软件包更加开放。OpenZaurus 现在是一个从新从源代码创建的基于 debian的嵌入式分布。 编译器和其他条目。Zaurus 开发者有许多免费的和商业的编译器和其他 SDK 可用。想要更改 Zaurus背景、图标和环境的外观吗?请尝试 themes section。 用户组。是的,一个用户组,加上它的大量有经验的输入,可以成为一个工具。并且还有一个非官方的 Zaurus开发 FAQ,其中有许多有用的信息。 在 参考资料部分可以找到到这些资源的链接。 安装工具
清单 2. 使用 file 命令检查输出的类型$ /opt/Embedix/tools/arm-linux/bin/gcc -o hello hello.c$ file hellohello: ELF 32-bit LSB executable, ARM, version 1 (ARM), dynamically linked (uses shared libs), not stripped 您可能对这一简短的偏离主题感兴趣。还记得我什么时候提到过 strings程序吗?我们来试一试该程序。 首先, 在您的二进制系统上运行本地 strings 程序: 清单 3. 运行本地 strings 程序$ /usr/bin/strings hello 接下来,在相同的二进制系统上运行 ARM 版本: 清单 4. ARM 版本$ /opt/Embedix/tools/arm-linux/bin/strings hello 在我的测试系统上,这些产生了稍微不同的结果。特定于 ARM 的 strings程序发现一个特定于 i386 的版本未发现的新字符串。 现在,我们在目标系统上测试该程序。 在目标系统上安装应用程序将文件移动到目标系统有几种方式:
使用无线卡或以太网适配器可能是移动文件最容易的方式。如果这样不行,将文件复制到 CompactFlash 或 SecureDigital介质上也是相当方便的。不幸的是,在发布本文时,Sharp 还未正式在 Linux 下支持 sync,但是复制到介质随处可用。 根据您的 Zaurus上的 ROM 版本的不同,系统可能不识别或安装 ext2fs 卡。因此,通过 FAT16 格式化的卡复制文件可能更实用一些。CF 和 SD卡一般在出厂前已经这样格式化了,所以它们可以开箱即用。 ( 简要的术语提示:ext2fs 卡是为 Linux文件系统格式化过的存储卡。 FAT16格式化的卡是为老式的 MS-DOS 文件系统格式化过的存储卡。 CF 卡是 CompactFlash,这是一些数码相机使用的一种介质标准。多数 CF设备是存储设备,但是 CF Ethernet、无线和串行适配器也存在。 SD(或者叫做 Secure Digital)卡是 MultiMediaCard技术与我们的目的之间的一个联系,SD 卡就像一个永久保存10%空间的 MMC 卡。) 就将您的可执行文件复制到一个已安装的卡。当将该卡移动到 Zaurus时,它就会自动地安装为 /usr/mnt.rom/cf。现在您就可以从卡运行应用程序了。 清单 5. 从卡运行应用程序$ /usr/mnt.rom/cf/helloHello, world! 现在您已经尝试了该程序,不过您可能更喜欢 Zaurus 的 ipkg 二进制软件包格式。ipkg文件只是一个包含三个其他文件的 tar 文件:
尽管有一个方便的脚本可为您做这项工作,但是您也可以手动创建 ipkg 文件。为防万一您确实想要手动创建一个 ipkg文件,所以我将简要讨论这种软件包的格式。利用您将使用的标准软件安装器,该软件包将正确地安装 'hello' 程序。
清单 5. 啊呀!请不要在 control 文件中放入注释*** Error: The following fields in CONTROL/control are missing a ':' ###ipkg-build: This may be due to a missing initial space for a multi-line field value 当我第一次看到该消息时有些被搞胡涂了。 复杂编译一旦您让编译器创建了在目标系统上正确运行的可执行程序,您就会开始遇到令人激动的问题了。 使用 对于一个相当标准的没有太多依赖性的程序,您可能只是忽略选择 C 编译器。FIGlet是一个程序,用于从平常的文本制造出大字母,如图 1 所示,通过更改 makefile 中的 图 1. 文本 'like this' 的 FIGlet 输出样例![]() FIGlet想要找到一些数据文件,所以您必须安装数据文件和程序。makefile 文件中对应的行是 一旦利用更改的 makefile创建了 这时,创建一个二进制目录和一个数据目录。二进制目录是 f/opt/QtPalmtop/bin,而数据目录是 f/usr/local/share/figlet。将 figlet、chkfont和 showfigfonts 复制到 f/QtPalmtop/bin 中;然后将 fonts/* 复制到 f/usr/local/share/figlet中。从上一个项目复制到 CONTROL 目录,并编辑 control 文件以给出软件包的名称和版本。同样, 有些程序可能需要更多的技巧。例如,要创建 这些宏是通过试图编译和运行输出 使用一个聪明的 hack, 在比较一般的情况下,您可能只是要手动编辑配置脚本或设置程序,以迫使它们获得正确的结果。在极端的情况下,可能有必要试图进行费事的程序“挖口”,比如在一台安装了本地开发工具的 Zaurus上本地运行配置脚本,然后将所有文件移回桌面开发系统 ,更改编译路径,并从这里启动。 结束语很多开发者还在犹豫是否尝试交叉编译,因为它听起来比实际要难得多。本文通过给出交叉编译的一个概览,帮助您开始了解交叉编译技术。本文提供了一些例子,讲述设置一个系统以实现交叉编译的程序。本文还提供了一些参考资料,以帮助您设置一个为 Sharp Zaurus手持计算机进行开发的系统。 |
|