专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »嵌入式开发 » 软件开发入门:交叉开发入门 »正文

软件开发入门:交叉开发入门

来源: 发布时间:星期五, 2008年12月12日 浏览:47次 评论:0

当编译器运行在个为另系统产生可执行系统上时就会出现交叉编译——当目标系统没有编译工具本地设置时或者当主机系统更快或具有更多资源时这是个重要概念在这篇 how-to 文章中Peter Seebach 讨论了交叉编译环境设置(使用 Sharp Zaurus 手持计算机作为焦点)并且介绍了工具安装、基本编译、在 Sharp Zaurus 手持计算机上安装以及像创建使用 configure 脚本这样高级问题
通常是在台计算机上编译然后再分布到将要使用其他计算机上当主机系统(运行编译器系统)和目标系统(产生将在其上运行系统)不兼容时该过程就叫做交叉编译

除了兼容性这个明显好处之外交叉编译还由于以下两个原因而非常重要:

当目标系统对其可用编译工具没有本地设置时
当主机系统比目标系统要快得多或者具有多得多可用资源时
在这篇文章中我将使用手持计算机 Sharp Zaurus 系列作为焦点讨论交叉编译环境设置我将介绍工具安装、基本编译问题、如何在手持计算机上安装以及像创建使用 configure 脚本这样高级问题如果按照文章组织顺序阅读您将最大地从本文受益本文类似于个教程步都以逻辑顺序相连

首先我将给出交叉编译个简洁概览

理解交叉编译
如果您熟悉交叉编译环境则可以跳过这但是如果不了解交叉编译则请继续往下阅读

我使用开发系统是 x86 体系结构 Linux 系统我在 SuSE Linux 8.2 上测试了这些指令测试目标系统是 Sharp Zaurus SL-5600 和 C700本文假设您具有 Unix 开发实践工作背景并使用过命令行

正如我前面提到当编译器运行在个为另个系统产生可执行系统上而且两个系统使用不同操作环境时就会出现交叉编译 另外当目标系统不具有它自己编译工具时或者当开发者可以平衡主机系统潜在更好性能或更多资源时交叉编译是有用

当提到交叉编译器时我不仅仅是指将种编程语言代码转换成对象代码软件还指其他必要开发工具:

个汇编器它是编译器工具链后端部分
个链接器它是编译器工具链后端部分
用于处理可执行和库些基本工具比如s
例如s 实用工具(它输出对象模块文本串)可能是有用但是主机环境版本对目标环境二进制系统并不怎么有用Zaurus 交叉开发工具中包含 s

在 Zaurus 上本地运行编译器是可能但是系统局限性阻碍有效工作这也是使交叉编译为开发者带来福音个原因典型台式机显示器和键盘非常有利于编辑工作另外台式机内存、处理器和存储容量也更能满足编译资源需要

现在让我们来安装所需工具
安装工具


开始您必须下载几个软件包可以从 Sharp Web 站点(在 参考资料 部分有到该站点链接)得到这些软件包,并且必须下载为 RPM您需要以下主要软件包:
交叉编译器 (gcc)
库 (glibc)
包含文件 (头文件)
“其他工具”——个包含交叉开发环境中常用工具软件包
接下来安装 RPM要做这需要 root 权限建议安装方法是为每个文件重复 rpm -Uvh filename.rpm
文件安装在 /opt/Embedix 目录中该目录有个稍微不寻常结构——实际二进制文件安装在 /opt/Embedix/tools/bin 目录中具有到安装在 /opt/Embedix/tools/arm-linux/bin 目录中这些二进制文件符号链接例如/opt/Embedix/tools/arm-linux/bin/gcc 是到 /opt/Embedix/tools/bin/arm-linux-gcc 个符号链接二者都可以使用

编译个简单测试快速测试已经正确地安装了工具我推荐传统 "Hello, world!" 这易于测试:
清单 1. 测试正确安装
#

(void) {
prf("Hello, world!");
0;
}




将该测试保存在个叫做 hello.c 文件中并编译它到编译器两条路径都可以工作——我喜欢使用 /opt/Embedix/tools/arm-linux/bin/gcc编译完之后利用 file 命令检查输出文件类型
清单 2. 使用 file 命令检查输出类型
$ /opt/Embedix/tools/arm-linux/bin/gcc -o hello hello.c
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (ARM),
dynamically linked (uses shared libs), not stripped




您可能对这简短偏离主题感兴趣还记得我什么时候提到过 s 吗?我们来试试该

首先 在您二进制系统上运行本地 s

清单 3. 运行本地 s

$ /usr/bin/s hello



接下来在相同二进制系统上运行 ARM 版本:

清单 4. ARM 版本

$ /opt/Embedix/tools/arm-linux/bin/s hello



在我测试系统上这些产生了稍微不同结果特定于 ARM s 发现个特定于 i386 版本未发现

现在我们在目标系统上测试该

在目标系统上安装应用
将文件移动到目标系统有几种方式:

使用标准 Zaurus sync 软件进行转移
复制到介质上
通过网络移动
使用无线卡或以太网适配器可能是移动文件最容易方式如果这样不行将文件复制到 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/hello
Hello, world!



现在您已经尝试了该不过您可能更喜欢 Zaurus ipkg 二进制软件包格式ipkg 文件只是个包含三个其他文件 tar 文件:

个文件即 data.tar.gz个压缩 tar 文件其中包含将被安装到正确目录结构中多个文件
第二个文件即 control.tar.gz个压缩 tar 文件其中包含安装脚本和信息
第三个文件即 debian-binary个纯文本文件其中包含串“2.0”该文件目前不真正做任何事情但是些工具期望该文件可用
尽管有个方便脚本可为您做这项工作但是您也可以手动创建 ipkg 文件为防万您确实想要手动创建个 ipkg 文件所以我将简要讨论这种软件包格式利用您将使用标准软件安装器该软件包将正确地安装 "hello"

创建个名叫 h 新目录用于保存文件名称并不定要叫 h但是后面老要键入它所以使用个简短名称
创建个名叫 h/opt/QtPalmtop/bin 子目录并将您 "hello" 可执行文件复制到该目录这对于显示所安装个好目录
创建个名叫 h/CONTROL 目录该目录形成 control.tar.gz 文件内容;h 中其他东西都放入 data.tar.gz 文件中在该目录中您只需要个文件叫做 control将以下数据放入该文件中:
清单 6. 将要放入 control 文件中信息
Package: hello
Priority: optional
Section: Misc
Version: 1.0
Architecture: arm
Maainer: Your name ([email protected])
Depends: libc6
Description: Just as stores have greeters, so to do PDAs have greeters.
This is a longer description, separate from the first _disibledevent='OUHfbaiducukKqO'>

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: