软件开发入门:交叉开发入门
来源: 发布时间:星期五, 2008年12月12日 浏览:47次 评论:0
当编译器运行在 ![](/icons/35245yi.gif) 个为另 ![](/icons/35245yi.gif) 系统产生可执行 ![](/icons/35245chengxu.gif) ![](/icons/35245de.gif) 系统上时 ![](/icons/35245dou.gif) 就会出现交叉编译——当目标系统没有编译工具 ![](/icons/35245de.gif) 本地设置时 ![](/icons/35245dou.gif) 或者当主机系统更快或具有更多资源时 ![](/icons/35245dou.gif) 这是 ![](/icons/35245yi.gif) 个重要 ![](/icons/35245de.gif) 概念 ![](/icons/35245dou2.gif) 在这篇 how-to 文章中 ![](/icons/35245dou.gif) Peter Seebach 讨论了交叉编译环境 ![](/icons/35245de.gif) ![](/icons/35245chushi.gif) 设置(使用 Sharp Zaurus 手持计算机作为焦点) ![](/icons/35245dou.gif) 并且介绍了工具 ![](/icons/35245de.gif) 安装、基本编译、在 Sharp Zaurus 手持计算机上安装 ![](/icons/35245chengxu.gif) ![](/icons/35245dou.gif) 以及像创建使用 configure 脚本 ![](/icons/35245de.gif) ![](/icons/35245chengxu.gif) 这样 ![](/icons/35245de.gif) 高级问题 ![](/icons/35245dou2.gif) 通常 ![](/icons/35245dou.gif) ![](/icons/35245chengxu.gif) 是在 ![](/icons/35245yi.gif) 台计算机上编译 ![](/icons/35245dou.gif) 然后再分布到将要使用 ![](/icons/35245de.gif) 其他计算机上 ![](/icons/35245dou2.gif) 当主机系统(运行编译器 ![](/icons/35245de.gif) 系统)和目标系统(产生 ![](/icons/35245de.gif) ![](/icons/35245chengxu.gif) 将在其上运行 ![](/icons/35245de.gif) 系统)不兼容时 ![](/icons/35245dou.gif) 该过程就叫做交叉编译 ![](/icons/35245dou2.gif) 除了兼容性这个明显 ![](/icons/35245de.gif) 好处之外 ![](/icons/35245dou.gif) 交叉编译还由于以下两个原因而非常重要: 当目标系统对其可用 ![](/icons/35245de.gif) 编译工具没有本地设置时 ![](/icons/35245dou2.gif) 当主机系统比目标系统要快得多 ![](/icons/35245dou.gif) 或者具有多得多 ![](/icons/35245de.gif) 可用资源时 ![](/icons/35245dou2.gif) 在这篇文章中 ![](/icons/35245dou.gif) 我将使用手持计算机 ![](/icons/35245de.gif) Sharp Zaurus 系列作为焦点 ![](/icons/35245dou.gif) 讨论交叉编译环境 ![](/icons/35245de.gif) ![](/icons/35245chushi.gif) 设置 ![](/icons/35245dou2.gif) 我将介绍工具 ![](/icons/35245de.gif) 安装、基本编译问题、如何在手持计算机上安装 ![](/icons/35245chengxu.gif) ![](/icons/35245dou.gif) 以及像创建使用 configure 脚本 ![](/icons/35245de.gif) ![](/icons/35245chengxu.gif) 这样 ![](/icons/35245de.gif) 高级问题 ![](/icons/35245dou2.gif) 如果按照文章 ![](/icons/35245de.gif) 组织顺序阅读 ![](/icons/35245dou.gif) 您将最大地从本文受益 ![](/icons/35245dou.gif) ![](/icons/35245yinwei.gif) 本文类似于 ![](/icons/35245yi.gif) 个教程 ![](/icons/35245dou.gif) 每 ![](/icons/35245yi.gif) 步都以逻辑顺序相连 ![](/icons/35245dou2.gif) 首先 ![](/icons/35245dou.gif) 我将给出交叉编译 ![](/icons/35245de.gif) ![](/icons/35245yi.gif) 个简洁 ![](/icons/35245de.gif) 概览 ![](/icons/35245dou2.gif) 理解交叉编译 如果您熟悉交叉编译环境 ![](/icons/35245dou.gif) 则可以跳过这 ![](/icons/35245yi.gif) 节 ![](/icons/35245dou2.gif) 但是如果不了解交叉编译 ![](/icons/35245dou.gif) 则请继续往下阅读 ![](/icons/35245dou2.gif) 我使用 ![](/icons/35245de.gif) 开发系统是 x86 体系结构 ![](/icons/35245de.gif) Linux 系统 ![](/icons/35245dou2.gif) 我在 SuSE Linux 8.2 上测试了这些指令 ![](/icons/35245dou2.gif) 测试 ![](/icons/35245de.gif) 目标系统是 Sharp Zaurus SL-5600 和 C700 ![](/icons/35245dou2.gif) 本文假设您具有 Unix 开发实践 ![](/icons/35245de.gif) 工作背景 ![](/icons/35245dou.gif) 并使用过命令行 ![](/icons/35245dou2.gif) 正如我前面提到 ![](/icons/35245de.gif) ![](/icons/35245dou.gif) 当编译器运行在 ![](/icons/35245yi.gif) 个为另 ![](/icons/35245yi.gif) 个系统产生可执行 ![](/icons/35245chengxu.gif) ![](/icons/35245de.gif) 系统上而且两个系统使用不同 ![](/icons/35245de.gif) 操作环境时就会出现交叉编译 ![](/icons/35245dou2.gif) 另外 ![](/icons/35245dou.gif) 当目标系统不具有它自己 ![](/icons/35245de.gif) 编译工具时 ![](/icons/35245dou.gif) 或者当开发者可以平衡主机系统潜在更好 ![](/icons/35245de.gif) 性能或更多 ![](/icons/35245de.gif) 资源时 ![](/icons/35245dou.gif) 交叉编译是有用 ![](/icons/35245de.gif) ![](/icons/35245dou2.gif) 当提到交叉编译器时 ![](/icons/35245dou.gif) 我不仅仅是指将 ![](/icons/35245yi.gif) 种编程语言 ![](/icons/35245de.gif) 代码转换成对象代码 ![](/icons/35245de.gif) 软件 ![](/icons/35245dou.gif) 还指其他必要 ![](/icons/35245de.gif) 开发工具: ![](/icons/35245yi.gif) 个汇编器 ![](/icons/35245dou.gif) 它是编译器工具链后端 ![](/icons/35245de.gif) ![](/icons/35245yi.gif) 部分 ![](/icons/35245yi.gif) 个链接器 ![](/icons/35245dou.gif) 它是编译器工具链后端 ![](/icons/35245de.gif) 另 ![](/icons/35245yi.gif) 部分 ![](/icons/35245dou2.gif) 用于处理可执行 ![](/icons/35245chengxu.gif) 和库 ![](/icons/35245de.gif) ![](/icons/35245yi.gif) 些基本工具 ![](/icons/35245dou.gif) 比如 ![](/icons/35245string.gif) s ![](/icons/35245dou2.gif) 例如 ![](/icons/35245dou.gif) ![](/icons/35245string.gif) s 实用工具(它输出对象模块 ![](/icons/35245de.gif) 文本 ![](/icons/35245zifu.gif) 串)可能是有用 ![](/icons/35245de.gif) ![](/icons/35245dou.gif) 但是主机环境版本对目标环境二进制系统并不怎么有用 ![](/icons/35245dou2.gif) Zaurus ![](/icons/35245de.gif) 交叉开发工具中包含 ![](/icons/35245string.gif) s ![](/icons/35245dou2.gif) 在 Zaurus 上本地运行编译器是可能 ![](/icons/35245de.gif) ![](/icons/35245dou.gif) 但是系统 ![](/icons/35245de.gif) 局限性阻碍有效 ![](/icons/35245de.gif) 工作 ![](/icons/35245dou.gif) 这也是使交叉编译为开发者带来福音 ![](/icons/35245de.gif) 另 ![](/icons/35245yi.gif) 个原因 ![](/icons/35245dou2.gif) 典型台式机 ![](/icons/35245de.gif) 显示器和键盘非常有利于编辑工作 ![](/icons/35245dou2.gif) 另外 ![](/icons/35245dou.gif) 台式机 ![](/icons/35245de.gif) 内存、处理器和存储容量也更能满足编译 ![](/icons/35245de.gif) 资源需要 ![](/icons/35245dou2.gif) 现在 ![](/icons/35245dou.gif) 让我们来安装所需 ![](/icons/35245de.gif) 工具 ![](/icons/35245dou2.gif) 安装工具 开始 ![](/icons/35245dou.gif) 您必须下载几个软件包 ![](/icons/35245dou2.gif) 可以从 Sharp ![](/icons/35245de.gif) Web 站点(在 参考资料 部分有到该站点 ![](/icons/35245de.gif) 链接)得到这些软件包,并且必须下载为 RPM ![](/icons/35245dou2.gif) 您需要以下主要 ![](/icons/35245de.gif) 软件包: 交叉编译器 (gcc) ![](/icons/35245dou2.gif) 库 (glibc) ![](/icons/35245dou2.gif) 包含文件 (头文件) ![](/icons/35245dou2.gif) “其他工具”—— ![](/icons/35245yi.gif) 个包含交叉开发环境中常用工具 ![](/icons/35245de.gif) 软件包 ![](/icons/35245dou2.gif) 接下来 ![](/icons/35245dou.gif) 安装 RPM ![](/icons/35245dou2.gif) 要做这 ![](/icons/35245yi.gif) 点 ![](/icons/35245dou.gif) 需要 root 权限 ![](/icons/35245dou2.gif) 建议 ![](/icons/35245de.gif) 安装方法是为每个文件重复 rpm -Uvh filename.rpm ![](/icons/35245dou2.gif) 文件安装在 /opt/Embedix 目录中 ![](/icons/35245dou2.gif) 该目录有 ![](/icons/35245yi.gif) 个稍微不寻常 ![](/icons/35245de.gif) 结构——实际 ![](/icons/35245de.gif) 二进制文件安装在 /opt/Embedix/tools/bin 目录中 ![](/icons/35245dou.gif) 具有到安装在 /opt/Embedix/tools/arm-linux/bin 目录中 ![](/icons/35245de.gif) 这些二进制文件 ![](/icons/35245de.gif) 符号链接 ![](/icons/35245dou2.gif) 例如 ![](/icons/35245dou.gif) /opt/Embedix/tools/arm-linux/bin/gcc 是到 /opt/Embedix/tools/bin/arm-linux-gcc ![](/icons/35245de.gif) ![](/icons/35245yi.gif) 个符号链接 ![](/icons/35245dou2.gif) 二者都可以使用 ![](/icons/35245dou2.gif) 编译 ![](/icons/35245yi.gif) 个简单 ![](/icons/35245de.gif) 测试 ![](/icons/35245chengxu.gif) ![](/icons/35245dou.gif) 快速测试已经正确地安装了工具 ![](/icons/35245dou2.gif) 我推荐传统 ![](/icons/35245de.gif) "Hello, world!" ![](/icons/35245chengxu.gif) ![](/icons/35245dou.gif) 这易于测试: 清单 1. 测试正确 ![](/icons/35245de.gif) 安装 #
(void) { pr f("Hello, world!"); 0; }
将该测试 保存在 个叫做 hello.c 文件中 并编译它 到编译器 两条路径都可以工作——我喜欢使用 /opt/Embedix/tools/arm-linux/bin/gcc 编译完 之后 利用 file 命令检查输出文件 类型![](/icons/35245dou2.gif) 清单 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 吗?我们来试 试该![](/icons/35245chengxu.gif) ![](/icons/35245dou2.gif)
首先 在您 二进制系统上运行本地 s :
清单 3. 运行本地 s ![](/icons/35245chengxu.gif)
$ /usr/bin/ s hello
接下来 在相同 二进制系统上运行 ARM 版本:
清单 4. ARM 版本
$ /opt/Embedix/tools/arm-linux/bin/ s hello
在我 测试系统上 这些产生了稍微不同 结果 特定于 ARM s 发现 个特定于 i386 版本未发现 新 串![](/icons/35245dou2.gif)
现在 我们在目标系统上测试该![](/icons/35245chengxu.gif) ![](/icons/35245dou2.gif)
在目标系统上安装应用![](/icons/35245chengxu.gif) 将文件移动到目标系统有几种方式:
使用标准 Zaurus sync 软件进行转移![](/icons/35245dou2.gif) 复制到介质上![](/icons/35245dou2.gif) 通过网络移动![](/icons/35245dou2.gif) 使用无线卡或以太网适配器可能是移动文件最容易 方式 如果这样不行 将文件复制到 CompactFlash 或 SecureDigital 介质上也是相当方便![](/icons/35245de.gif) 不幸 是 在发布本文时 Sharp 还未正式在 Linux 下支持 sync 但是复制到介质随处可用![](/icons/35245dou2.gif)
根据您 Zaurus 上 ROM 版本 不同 系统可能不识别或安装 ext2fs 卡 因此 通过 FAT16 格式化 卡复制文件可能更实用 些 CF 和 SD 卡 般在出厂前已经这样格式化了 所以它们可以开箱即用![](/icons/35245dou2.gif)
(简要 术语提示:ext2fs 卡是为 Linux 文件系统格式化过 存储卡 FAT16格式化 卡是为老式 MS-DOS 文件系统格式化过 存储卡 CF 卡是 CompactFlash 这是 些数码相机使用![](/icons/35245de.gif) 种介质标准 多数 CF 设备是存储设备 但是 CF Ethernet、无线和串行适配器也存在 SD(或者叫做 Secure Digital)卡是 MultiMediaCard 技术与我们 目 之间![](/icons/35245de.gif) 个联系 SD 卡就像 个永久保存10%空间 MMC 卡 )
就将您 可执行文件复制到 个已安装 卡 当将该卡移动到 Zaurus 时 它就会自动地安装为 /usr/mnt.rom/cf 现在您就可以从卡运行应用 了![](/icons/35245dou2.gif)
清单 5. 从卡运行应用![](/icons/35245chengxu.gif)
$ /usr/mnt.rom/cf/hello Hello, world!
现在您已经尝试了该![](/icons/35245chengxu.gif) 不过您可能更喜欢 Zaurus ipkg 二进制软件包格式 ipkg 文件只是 个包含三个其他文件 tar 文件:
第 个文件 即 data.tar.gz 是 个压缩 tar 文件 其中包含将被安装到正确目录结构中 多个文件![](/icons/35245dou2.gif) 第二个文件 即 control.tar.gz 是 个压缩 tar 文件 其中包含安装脚本和信息![](/icons/35245dou2.gif) 第三个文件 即 debian-binary 是 个纯文本文件 其中包含 串“2.0” 该文件目前不真正做任何事情 但是 些工具期望该文件可用![](/icons/35245dou2.gif) 尽管有 个方便 脚本可为您做这项工作 但是您也可以手动创建 ipkg 文件 为防万 您确实想要手动创建 个 ipkg 文件 所以我将简要讨论这种软件包 格式 利用您将使用 标准软件安装器 该软件包将正确地安装 "hello" ![](/icons/35245chengxu.gif) ![](/icons/35245dou2.gif)
创建 个名叫 h 新目录用于保存文件 名称并不 定要叫 h 但是 后面老要键入它 所以使用 个简短 名称 创建 个名叫 h/opt/QtPalmtop/bin 子目录 并将您 "hello" 可执行文件复制到该目录 这对于显示所安装![](/icons/35245de.gif) 是 个好目录![](/icons/35245dou2.gif) 创建 个名叫 h/CONTROL 目录 该目录形成 control.tar.gz 文件 内容;h 中 其他东西都放入 data.tar.gz 文件中 在该目录中 您只需要 个文件 叫做 control 将以下数据放入该文件中: 清单 6. 将要放入 control 文件中 信息 Package: hello Priority: optional Section: Misc Version: 1.0 Architecture: arm Ma ainer: 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'>
相关文章
读者评论
发表评论
|
|