嵌入式系统讲义 第5章 嵌入式系统软件开发环境与工具 嵌入式系统讲义 第5章 嵌入式系统软件开发环境与工具 周国运 2007.9
第5章主要内容 1、Linux与嵌入式Linux概述 2、Windows下的Linux环境软件---cygwin 3、Linux文件系统结构 5、Linux文本编辑器vi 6、Linux编译器gcc及编译工具 7、交叉编译工具的创建
5.1 Linux与嵌入式Linux 主要内容 1、Linux操作系统的产生 2、Linux操作系统的特点 3、Linux操作系统的组成
5.1.1 Linux的产生 Linux诞生背景 1984年起,在MIT(美国麻省理工学院)的支持下,Richard Stallman创建了自由软件基金会FSF(Free Software Foundation)。 FSF的主要项目是GNU(GNU’s Not Unix),它的目标是建立可自由发布和可移植的类Unix操作系统。同时Richard拟定了通用公共许可证GPL(General Public License)作为GNU的版权声明。
从1984年到1991年,GNU完成了与UNIX兼容的大部分外围工作,包括OS的shell、C和C++编译器gcc/gcc++等内容,就是没有自己的内核。 Linux内核的诞生 1991年,芬兰赫尔辛基大学的学生Linus Torvald 为实习MINIX(教学用的微型 UNIX)编写了一个比MINIX功能更强、能够在低档微机上操作系统内核,将其命名为Linux。 GNU项目的实现 Linux内核的诞生,为GNU项目划上了一个圆满的句号,从此就诞生了GNU(类UNIX),名字就是Linux
Linux所包含的内容 目前大多数人用它来表示以Linux内核为基础的整个操作系统。从这种意义讲,Linux指的是源码开放,包含内核和系统工具、完整的开发环境和应用的类Unix操作系统。
5.1.2 Linux的主要特点 开放性:系统遵循世界标准规范,特别是遵循开放系统互连(OSI)国际标准。 多用户:系统资源可以被不同用户使用,每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响。 多任务:计算机同时执行多个程序,而且各个程序的运行互相独立。
良好的用户界面 :两种界面:用户界面和系统调用。Linux还为用户提供了图形用户界面。与Windows类似。
5.1.2 Linux的主要特点(3) 可靠的安全系统:Linux采取了许多安全技术措施,包括对读、写控制、带保护的子系统、审计跟踪、核心授权等,为网络多用户环境中的用户提供了必要的安全保障。 良好的可移植性:将操作系统从一个平台(一种微处理器)转移到另一个平台,仍然能按其自身的方式运行的能力。能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。
5.1.3 Linux的组成 LINUX的内核:含有设备驱动程序、系统服务等程序,具有中断处理、进程调度、原语管理等功能。 LINUX SHELL:Shell是系统的用户界面,它是一个命令解释器,它解释用户输入的命令,并且把它们送到内核。提供了用户与内核进行交互操作的一种接口。
5.1.3 Linux的组成(2) LINUX文件系统: 是文件存放在磁盘等存储设备上的组织方法。Linux能支持多种目前许多的文件系统,如EXT2、EXT3、FAT、VFAT、ISO9660、NFS、SMB等。 LINUX应用系统:标准的Linux系统都有一整套称为应用程序的程序集,包括文本编辑器、编程语言、X Window、办公套件、Internet工具、数据库等。
5.1.4 Linux的内核版本 Linux内核采用双树结构:一棵树是稳定树,主要用于发行;另一棵树是非稳定树或开发树,用于产品开发、改进、测试。 源代码版本序号形式:为x.y.zz结构,其中x为主版本号,代表核心的改动升级;y为次版本号,表示功能性的改动;zz为末版本号,表示BUG的改动。其中x介于0到9之间,yy和zz则介于0到99之间。
双树区分:对于稳定树来说,y是偶数;对于开发树来说,y是比相应稳定树大1的奇数。例2.4.18等为稳定内核版本。 5.1.4 Linux的内核版本(2) 双树区分:对于稳定树来说,y是偶数;对于开发树来说,y是比相应稳定树大1的奇数。例2.4.18等为稳定内核版本。
5.1.5 嵌入式Linux操作系统概述 一、嵌入式Linux操作系统 嵌入式Linux是按照嵌入式操作系统的要求而设计的一种小型操作系统。由一个内核及一些根据需要进行定制的系统模块组成。其kernel很小,一般只有几百kB左右。即使加上其它必须的模块和应用程序,所需的存储空间也很小。它具有多任务、多进程的系统特征,有些还具有实时性 。
二、嵌入式Linux的移植 嵌入式Linux需要移植:对于嵌入式Linux,一般都不是原封不动地使用,而是要考虑各种具体系统的特点,有针对性地对Linux内核加以裁减、修改和补充。 小型嵌入式Linux系统:只需要引导程序、Linux微内核(由内存管理、进程管理和事务处理构成)、初始化进程3个基本元素。
嵌入式Linux系统可以扩展:可以加上文件系统(支持十多种文件系统类型,如ext2、ext3、NFS,cramfs等)、TCP/IP网络支持、存储更多数据用的磁盘功能、提供设计精简的应用程序。
三、嵌入式Linux的主要特点 是精简标准Linux的内核 适应于多种CPU和多种硬件平台 性能稳定、裁剪性很好、开发和使用都很容易 可以使用Unix或Linux在PC上的应用程序。
四、嵌入式Linux操作系统的优势 (1)支持多种体系结构 支持x86, ARM, IPS,APARC等多种CPU,已被移植到数十种硬件平台上。 (2)多任务,内核稳定,可定制,源代码开放 (3)强大的网络支持功能 支持TCP/IP协议,及其上的高层协议,如ftp, Telnet, http等。支持Socket网络编程。
(4)支持多文件系统 linux支持FAT32, EXT2, EXT3等多种文件系统,支持虚拟文件系统,同时还可以连接其它的文件系统,如ROMFS,JFFS等文件系统。 (5)驱动丰富、支持大量外设 linux支持所有的PC外设,具有丰富的外设驱动程序。
(6)Linux具备一整套工具链 容易自行建立嵌入式系统的开发环境、交叉运行环境。 可以跨越嵌入式系统开发中,需要使用仿真工具的障碍。 对于Linux操作系统,可以直接使用内核调试器来做操作系统的内核调试和查错。
5.2 Windows下的Linux环境 软件---Cygwin 主要内容 1、 Cygwin 软件功能 2、 Cygwin 软件下载 3、 Cygwin 软件安装
5.2.1 Cygwin软件功能 Cygwin是一个在Windows平台上运行的、模拟Linux环境的软件,并且该软件也将GNU工具移植到了Win32系统上。 安装了Cygwin后,启动Cygwin,Windows系统就模拟出一部Linux主机,用户便可像在纯Linux下一样使用Linux及其各种工具软件、应用软件等。
5.2.1 Cygwin软件功能(2) 该软件对于刚开始使用Linux的人来说,是极好的选择,用户可以方便地回到Windows下查看文件和目录结构,也可以在Windows下进行各种文件操作,如复制删除文件、移动文件、解压文件、查找文件等。
5.2.2 Cygwin软件下载 Cygwin是Cygwin solutions公司开发的自由软件,可以到公司网站上免费下载,包括Cygwin和各种开发工具的源代码程序 。 Cygwin solutions公司的网址是:http:// www.cygwin.com/。在网页上单击“Install Cygwin Now”,会先下载一个叫做setup.exe的安装程序,运行Cygwin目录下的“setup.exe”,会出现一个下载安装的界面,有三项:“Intall from Internet”、
有三项:“Intall from Internet”、“Download without Intalling”、“Intall from Local Directory”,一般应选择第二项,先下载,再安装,不进行直接安装。
5.2.3 Cygwin软件安装 2、选择安装、使用范围 1、启动安装 再次运行Cygwin目录下的“setup.exe”,选择第三项“Intall from Local Directory”,进行本地安装。 2、选择安装、使用范围 当出现如下界面时,(1)需要选择安装目录,一般不安装在C盘,注意磁盘空间应不少于2GB;(2)选择使用范围和文本文件类型,选择默认项:“All Users”、“Unix” 即可。
3、选择安装软件包 每种软件包有“Default”、“Install”、“Reinstall”、“Uninstall”4种安装选择,可以根据需要逐一选择。 一般可以做如下选择: (1)选择All 为“Default” (2)对如下软件包选择“Install”: Admin: 基本服务工具 Archive: 压缩、解压工具 Base: 基本的Linux工具 Libs: 系统库文件
Net: 网络工具 Shall: 外壳工具集 Untils: 实用工具 Editor: 编辑器集
5. 3 Linux文件系统 主要内容 1、Linux文件系统 2、Linux文件系统结构
5.3.1 Linux文件系统概述 文件结构是文件存放在磁盘等存贮设备上的组织方法。 文件结构主要体现在对文件和目录的组织上。目录提供了管理文件的一个方便而有效的途径。 linux使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型
5.3.2 Linux与DOS文件系统区别 / Linux文件系统是一个目录树结构,最上层是根目录,其他的所有目录都是从根目录出发而生成的。 /sbin /usr /etc /root /lib /hom /mnt Dos文件系统也采用目录树的结构,但DOS以每个分区为树根,有几个分区就有几个树型结构 。 C D E
Linux下,任何一个目录都可以是一个分区。因此,在分区时,必须将一个分区安装在树根下面。
5.3.3 Linux文件系统结构 “/”根目录: 包含基本的操作系统和维护工具。这个目录的文件可以启动系统,并且需要的话,可以完成紧急维护和修复的功能。 “/usr”目录: 包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变的。这个目录也包含你的Linux发行版本的主要的应用程序。 “/var”目录: 存放在操作中被改变的文件:假脱机文件、记录文件、加锁文件、临时文件和页格式化文件等。正常
“/home”目录: 包含用户的文件:参数设置文件、个性化文件、文档、数据、EMAIL、缓存数据等。这个目录在系统省级时应该保留。 “/mnt”目录: 一般用来临时挂载别的文件系统,如FAT32,NTFS等 “/bin”目录: 系统启动时需要的执行文件(二进制),这些文件可以被普通用户使用。
“/sbin”目录: 系统执行文件(二进制),这些文件不打算被普通用户使用。(普通用户仍然可以使用它们,但要指定目录。) “/etc”目录: 操作系统的配置文件目录。 “/root”目录: 系统管理员(也叫超级用户或根用户)的Home目录。 “/dev”目录: 设备文件目录。LINUX下设备被当成文件,正常情况下,设备会有一个独立的子目录。这些设备的内容会出现在独立的子目录下。
“/lib”目录: 根文件系统目录下程序和核心模块的共享库。 “/boot”目录: 用于启动加载程序的文件。当计算机启动时(如果有多个操作系统,有可能允许你选择启动哪一个操作系统),这些文件首先被装载。这个目录也会包含Linux核(压缩文件 vmlinuz)。但Linux核也可以存在别处,只要配置LILO并且LILO知道Linux核在哪儿。 用于启动加载程序(LILO或GRUB)
“/opt”目录: 可选的应用程序。譬如,REDHAT 5. 2下的KDE (REDHAT 6 “/opt”目录: 可选的应用程序。譬如,REDHAT 5.2下的KDE (REDHAT 6.0下,KDE放在其它的X-WINDOWS应用程序中,主执行程序在/usr/bin目录下) “/tmp”目录 : 临时文件。该目录会被自动清理干净。 “/lost+found”目录: 在文件系统修复时恢复的文件。
5.3.4 挂载文件系统 将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点。 当一个机器上装了多个操作系统,比如在Linux工作时需访问Windows下的C盘,则需要在Linux上挂载 采用mount命令挂载,umount命令卸载。 为避免每次系统启动时都挂接,可写入相应命令到/etc/fstab。
加挂FAT32系统 首先进入/mnt目录,新建所挂接分区对应目录,例winD mount –t vfat –o iocharset=cp936 /dev/hda2 /mnt/winD 其中,hda2为D盘对应的设备文件,可通过“fdisk -l”命令或“系统工具/硬件浏览器”中查看各盘对应的设备文件。 加挂ntfs系统 -t ntfs 加挂U盘上的文件系统 mount –t vfat –o iocharset=cp936 /dev/sda1 /mnt/udisk
5.3.5 常用的Linux文件系统 Linux系统核心支持十多种文件系统类型: ext、ext2、ext3、CRAMFS、msdos、umsdos、Vfat、NTFS等。 minix linux:最早使用的文件系统 ext2 linux和ext3 linux:目前常用的文件系统 nfs: 网络文件系统 cramfs: 只读文件系统
5.3.6 Linux的文件类型 文件名 Linux文件的名字可以由字母字符、下划线和数字组成,也可以加上句号和逗号。 文件名的第一个字符不能是数字,短划线、句点和星号等被系统用作特殊符号的其他符号。 用“.”开始的文件为隐藏文件,称为“点文件”。 可用“file 文件名”来查看文件类型。
(1)、压缩的和归档的文件 .bz2 — 使用 bzip2 压缩的文件 . gz — 使用 gzip 压缩的文件 .tar — 使用 tar(tape archive,磁带归档的简写)压缩的文件,又称 tar 文件 .tbz — 用 tar 和 bzip 压缩的文件 .tgz — 用 tar 和 gzip 压缩的文件 .zip — 使用 ZIP 压缩的文件,在 MS-DOS 应用程序中常见。多数为 Linux 压缩的文件使用 gzip 压缩,因此 Linux 文件中的 .zip 归档较少见。
(2)、 文件格式 .au — 音频文件 .gif — GIF 图像文件 .html/.htm — HTML 文件 .jpg — JPEG 图像文件 .pdf — 文档的电子映像;PDF 代表 Portable Document Format(可移植文档格式) .png — PNG 图像文件(Portable Network Graphic 的简写,可移植网络图形) .ps — PostScript 文件,为打印而格式化过的文件 .txt — 纯 ASCII 文本文件 .wav — 音频文件 .xpm — 图像文件
(3)、系统文件 . .conf — 一种配置文件。配置文件有时也使用 .cfg。 .lock — 锁(lock) 文件;用来判定程序或设备是否正在被使用 .rpm — Red Hat 用来安装软件的软件包管理器文件
(4)、编程和脚本文件 .c — C 程序语言的源码文件 .cpp — C++ 程序语言的源码文件 .h — C 或 C++ 程序语言的头文件 .o — 程序的对象文件 .pl — Perl 脚本 .py — Python 脚本 .so — 库文件 .sh — shell 脚本 .tcl — TCL 脚本
5. 4 Linux常用命令 主要内容 1、Linux外壳shell 2、Linux常用命令
5.4.1 Linux外壳shell Linux外壳的功能:
常用的shell: bash、ash、csh、ksh、tcsh等。 bash是Linux默认使用的shell,它由Brian Fox 和 Chet Ramey共同完成的。 bash是Bourne Again Shell的缩写,内部命令有40个。Bash有如下特点: 1)使用方向键查阅已使用过的命令行。 2)补全命令行,按Tab键。 3)可以使用通配符“?”、“*”。 4)有管道命令“|”,用“|”可将多个命令连接起来执行,前面命令的输出是后者的输入。
5.4.2 Linux常用命令 1、ls---文件及子目录名列表 语法格式:ls [option] [file] ls –a 显示所有文件,包括隐藏文件。 ls –l 以默认方式显示文件属性,包括大小、日期、所有者、权限及名称。 ls –F 以默认方式显示文件及类型,以“/”结尾的为目录,以“*”结尾的为可执行文件,以“@”结尾的为符号链接。
文件属性符号 arwxrwxrwx n owner group size date name a:文件性质,可以是: d: 目录文件; n: l: 符号链接文件; (1)对文件指硬连接数 b: 块类型设备文件; (2)对目录指含的子目 c: 字符型设备文件。 录数 r: read,读 w: write,写 x: execute,执行 红色:文件拥有者权限 黑色:文件组拥有者权限 蓝色:其他用户的权限
2、查看文件内容命令 1)cat---连续显示 格式:cat filename 如: cat file1 以连续方式显示file1内容 cat file2 | more 以分页方式显示file2内容 2)more---分页显示 格式:more filename 按空格查看下一页,按回车下一行。
3、cd---改变工作目录(目录切换) 语法格式:cd [directory] 如: cd dir 切换到当前目录下的dir 目录。 cd ~/abc 切换到当前目录下的某目录下的abc目录。 几个符号目录: “/”:根目录 “.”:本级目录; “..”:上级目录
4、cp---复制文件和目录 语法格式: cp [源文件及路径] [目标文件及路径] cp -r 源目录 目标目录 如: cp file1 file2 将文件file1复制成file2。 cp /root/file . 将/root目录下的文件file 复制到当前目录下,名字仍为file 。 cp file /usr 将当前目录下的文件file 复制到/usr目录下,名字仍为file 。 cp –r dir1 dir2 将dir1下的文件和目录,全部复制到dir2目录下。
5、 rm---删除文件 语法格式:rm [filename] 如: rm file1 删除当前目录下的file1文件 rm *.c 删除当前目录下的所有c文件 rm abc.* 删除当前目录下主文件名为abc的所有文件。 rm * 删除当前目录下的所有文件
6、mv---移动或更改文件、目录名 语法格式:mv 源地址 目标地址 如: mv file1 file2 将文件file1更改为file2 mv file1 dir2 将文件file1移动到目录dir2下,文件名仍为file1。 mv dir1 dir2 将目录dir1更改为dir2。
7、建立目录 语法格式:mkdir [option]目录名 如: mkdir dir1 在当前目录下建立新目录dir1。 mkdir dir1/dir2 在当前目录下的dir1目录下建立新目录dir2。 mkdir -p dir3/dir4 在当前目录下先建立新目录dir3 ,然后在dir3下建立新目录dir4。
8、删除目录 语法格式:rmdir 目录名 rm –r 目录名 如: rmdir dir1 删除目录dir1(dir1下必须为空)。 rm –r dir2 删除目录dir2及其子目录下所有文件。
9、查看文件内容命令 1)cat---连续显示 格式:cat filename 如: cat file1 以连续方式显示file1内容 cat file2 | more 以分页方式显示file2内容 2)more---分页显示 格式:more filename 按“空格”查看下一页,按“回车”下一行。
3)less---分页并且可往回查看 格式:less filename 按“空格”查看下一页;按“b”查看上一页;按“回车”下一行;按“q”键退出。
10、ln---文件链接 (1)硬链接 语法格式: ln 源文件名及路径 目标文件名及路径 如: ln file1 dir2/file2 将当前目录下file1,链接到当前目录下的dir2下,名为file2 ln dir3/file3 file4 将当前目录下的dir3目录下的file3,链接到当前目录下,名为file4 删除方法:用rm命令
(2)符号链接(相当于Win2k的快捷方式) 语法格式: ln –s 源文件名及路径 目标文件名及路径 如: ln -s file1 dir2/file2 将当前目录下的文件file1,链接到当前目录下的dir2目录下,文件名为file2。 ln –s dir3/file3 file4 将当前目录下dir3目录下的文件file3,链接到当前目录下,文件名为file4。 删除方法:用rm命令
11、 tar---压缩与解压 (1)压缩文件 语法格式: tar cfzv 目标文件路径 被压缩的目录 如: tar cfzv dir1/file1.tgz dir2 将当前目录下的dir2目录下的所有文件,压缩为文件file.tgz,存放在当前目录下的dir1目录下。 说明:选项4个字母cfzv,不分次序。
(2)解压文件 语法格式: tar xfzv 被解压的文件路径 保存的目录 tar xfzv file.tgz dir1 将文件file.tgz 解压,保存到当前目录下的dir1目录下。 说明:选项4个字母xfzv,不分次序。
12、磁盘、目录挂接与卸载 (1)mount---挂接 语法格式:mount [option] 被挂接的设备 挂接点 mount IP地址:被挂接的目录 挂接点 option:文件类型:二进制、文本、可执行等 如: mount -t yaffs /dev/mtdblock/0 /mnt 把/dev/mtdblock/0 装载到 /mnt 目录 mount -t nfs 192.168.0.1:/friendly-arm/root /mnt 将nfs 服务的共享目录/friendly-arm/root 挂接到/mnt 目录 (2)umount---卸载 语法格式:umount 被挂接目录或挂接点
12、shell应用手册---man 对于Linux的命令,随时可以使用随机所带的应用手册获得帮助。 获得帮助方法: man 命令名 如: man cp
13、Linux应用程序的帮助---help 获得帮助方法: 应用程序名 --help 如: gcc --help
5. 5 Linux文本编辑器vim 主要内容 1、vim概述 2、vim的启动 3、vim的工作模式
5.5.1 vim概述 vim是Linux的全屏幕编辑器,是vi (Visual interface)的增强型版本,用它可以进行文本文件的编辑、数据文件编辑,也用它做源程序的编辑。类似于Windows/ DOS下的EDIT编辑器。 Vim可以执行输出、删除、查找、替换、块操作等众多文本操作。 Linux还有一个功能更强大的全屏幕编辑器---Emacs,另外Linux还有两个行编辑器---Ed和Ex,现在已经很少使用。
5.5.2 vim启动 Vim的启动有两种方法: (1)vim 回车 启动vim,并且打开一个新文件。 (2)vim file 回车 启动vim,并且打开file文件,如果file不存在,则创建file文件。
5.5.3 vim的工作模式 vim有三种工作模式:命令行模式、文本输入模式、末行模式。 一、命令行模式 1、命令行模式的功能 注意:(1)在该模式下,从键盘所有输入的命令,都不在屏幕上显示出来;(2)如果输入的不是合法命令则响铃报警。
2、进入命令行的方法 3、命令行命令 (1)退出编辑器 (1)启动Vim时自动进入; (2)在其它模式时按“ESC”键进入。 Z、Z 保存所编辑的内容,退出vim,返回到shell。
(2)增加文本命令 a :在光标位置后增加文本 shift+a :在当前行末增加文本 i :在光标位置前增加文本 shift+i :在当前行前面增加文本 o :在当前行下打开一行增加文本 shift+o :在当前行上打开一行增加文本
(3)块复制命令 V/v :块开始 Y/y :块结束并复制 P/p :块粘贴 (4)删除文本 x :删除光标位置的字符 d、$ :从当前光标位置删除到行尾 d、d :删除当前行 shift+d :删除当前行的剩余部分
(5)改变和替换命令 r :替换一个字符 shift+r :替换字符序列 c、w :把当前字从光标位置改变到字尾 c、e :同上 c、b :把当前字从字的开始改变到光标的前一个字符 c、$ :把一行从光标位置改写到行尾 shift+c :同上 c、c :改变整行
二、文本输入模式 在该模式下从键盘输入的均作为编辑的内容。 文本输入模式进入方法 使用所有的“增加文本命令”和“改变和替换命令”后,均切换到文本输入模式。 最常用的是“a命令”和“i命令”: a :在光标位置后增加文本 i :在光标位置前增加文本
三、末行命令模式 在屏幕的末行有“:”符号,输入的命令在末行显示,按回车执行命令。 1、进入末行命令模式的方法 在命令模式下按“:”键,便进入末行命令模式。 2、退出末行模式的方法 一个末行命令执行完后,便自动回到命令行模式。 3、末行模式的功能与命令 功能有二:保存文件、退出编辑器。
末行模式的命令如下: (1)保存和写文件命令 :w 将缓冲区的内容写到文件 :w 文件名 将缓冲区的内容写到指定文件 (2)退出编辑器命令 :q 未修改则退出,做过修改则提示保存 :q! 不保存退出 :x 保存后退出(总做保存) 对:q有提示时,若不保存退出,再进入末行模式,:q!;若保存退出,可输入Z、Z,或再进入末行模式,:x
5. 6 Linux编译器gcc及编译工具 主要内容 1、编译器gcc 2、编译工具make命令和makefile文件
5.6.1 Linux编译器gcc 一、编译器gcc概述 gcc的是GNU C Compiler 的缩写,由 Richard Stallman开发。 经过多年的发展,gcc不仅仅支持C语言,还支持Adc语言、C++语言、Java语言、pascal语言、COBOL语言等等。变成了GNU Compiler Collection,即GMU编译器集。 gcc对于各种硬件平台都提供了完善的支持。 gcc是GNU组织的免费C编译器。 由gcc编译所生成的代码执行效率较高,平均效率高出20---30%。
gcc的功能 gcc的整个编译过程,实质上是分四步进行的,每一步完成一个特定的工作,这四步分别是: 预处理(也称预编译,Preprocessing) 编译(Compilation) 汇编(Assembly) 连接(Linking) 具体完成哪一步,是由gcc后面的开关选项和文件类型决定的。
gcc的格式为:gcc [option] file……
-g 要求编译器在编译的时候,产生对程序进行调试的信息;(不用输入所产生的可执行文件名,自动生成a.exe) -S 表示编译器只进行编译,而不做汇编和链接; (不需要输入目标文件名) -O 是编译器对程序提供的编译优化选项,可以提高执行文件的运行效率; -Wall 指定产生全部的警告信息。
gcc所生成的目标文件格式 所生成的为可执行文件,Linux有两种可执行文件:ELF(a.exe)和a.out。 ELF(Executive linked file)为可执行链接文件,是一种新标准,功能更强大。文件的扩展名为 .exe。 ELF为Linux的默认格式
三、gcc应用举例 编辑源程序,文件名为Hello.c void main() { printf(“Hello the world!\n”); } 1) gcc –o hello hello.c 对hello.c进行编译链接,生成可执行文件hello.exe。需要输入目标文件名。 2) gcc –c hello.c 只对hello.c进行编译、汇编,不链接。产生的目标文件为hello.o。
3) gcc –g hello.c 编译时产生调试信息,也产生了可执行文件a.exe。不需要输入目标文件名。 4) gcc –S hello.c 只对hello.c编译,产生了汇编语言文件hello.s。不需要输入目标文件名。 5) gcc –O hello.c 优化编译,并且产生了可执行文件a.exe。不需要输入目标文件名。 6) gcc –Wall hello.c 产生全部警告信息,同时产生了可执行文件a.exe。不需要输入目标文件名。
5.6.2 编译器工具Makefile文件和Make命令 对工程系统有很多文件,逐个编译麻烦 2、Makefile和Make的功能 (1)Makefile文件内容 按照规则,对系统中本目录下的文件(.c、.s、.o、.h、.lib等)根据相互关系和要求进行组织,设定各自的编译方法,指定所生成的目标。 Makefile是一种文本格式文件。
(2)Makefile和Make的功能 Make是Makefile文件的解释器 Make对Makefile文件解释后,生成Linux的shell命令和gcc编译命令,接着对命令执行,最终生成目标文件。 Makefile是工程系统编译批处理文件。 二、Makefile文件的基本内容 Makefile文件一般包含三个方面的内容: 需要创建的项目(.o或.exe文件名) 项目所需要的文件 创建项目需要运行的命令
例:有一个C源文件example.c,包含有头文件example.h,需要使用gcc命令来生成目标文件example.o。 (3)创建目标的方法命令:gcc -c 则该Makefile文件的内容为: example.o:example.c example.h gcc -c example.c 创建的目标及需要的文件 创建目标的方法
例2:下面Makefile文件生成myproject.exe文件。内容如下: myproject: p1.o p2.o gcc -o myproject p1.o p2.o p1.o:p1.c p1.h gcc –c p1.c p2o:p2.c util.c gcc –c –o p2.o p2.c util.c
三、完成大工程系统编译的方法 (1)每个子目录都有自己的Makefile,负责本子目录文件的编译和控制下级目录的编译。 (2)系统有一规则文件Rules.make,为整个系统所有的Makefile所用。放在顶层 (3)上级Makefile文件对下级Makefile文件进行控制,逐级递归到最低层的Makefile文件。最顶层的Makefile文件给出创建的目标文件。
关于对于linux的内核编译控制 (1)linux内核配置文件.config: 决定整个内核各个部分的取舍, .config被包含在顶层Makefile中,通过各级Makefile,实现.config的配置。( .config通过执行make menuconfig(是一图形界面配置软件)自动产生) (2)顶层Makefile有两个任务:产生压缩的Linux内核镜像文件vmlinux、Linux内核模块module。 (3)顶层还有一规则文件Rules.make,控制系统编译,被包含在顶层Makefile中。
四、Makefile中的变量 Makefile中变量的作用:向下级传递选择信息和控制信息。 (1)版本信息变量 (2)CPU体系结构变量ARCH (3)路径信息变量TOPDIR、SUBDIRS (4)内核组成信息变量 (5)编译信息变量 (6)配置变量CONFIG_*
五、Rules.make中的变量 Rules.make定义了很多变量,最重要的是编译、链接列表变量。 O_OBJS、L_OBJS、OX_OBJS、LX_OBJS 产生目标需要的文件列表 M_OBJS、MX_OBJS 产生模块需要 O_TARGET、L_TARGET 链接目标 六、Linux配置文件.config的生成 关于Linux配置文件.config,有两种界面的配置方法:字符界面和图形界面,现在一般都用图形界面,对各个项目进行选择即可,后面将会用到。
七、利用Makefile对工程 的编译方法 方法1:在Linux下执行 make makefile 便可完成对整个工程的编译。 方法2:在Linux下执行 make 则make便会在当前目录下搜索makefile文件,对其解释执行,完成对整个工程的编译。
5.7 交叉编译工具的创建 主要内容 1、交叉编译的几个概念 2、交叉编译工具的创建方法
一、交叉编译的几个概念 1、交叉编译:就是在一个平台上生成可以在另一个平台上执行的代码。 采用交叉编译的主要原因是,多数嵌入式目标机不能提供足够的资源供编译过程使用,因而只好将编译工作转移到高性能的宿主机中进行。 2、编译环境:即创建交叉编译工具的编译环境是一个由编译器、连接器和解释器组成的综合开发环境。
3、交叉编译工具(链): 交叉编译工具(链)主要包括针对目标系统的编译器 gcc、目标系统的二进制工具binutils、目标系统的标准c库glibc和目标系统的 Linux 内核头文件。
二、交叉编译工具的创建方法 1、 准备编译工具和Linux内核 包括binutils、gcc、glibc及Linux 内核在内的源代码,尽量选用较新版本,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致,并设定shell变量PREFIX指定可执行程序的安装路径。 2、编译binutils 运行configure文件,并使用 --prefix= $PREFIX参数指定安装路径,使用--target= arm-linux参数指定目标机类型,然后执行make install。
3、配置Linux内核头文件 执行make mrproper进行清理工作,然后执行 make config ARCH=arm (或 make menuconfig/ xconfig ARCH=arm) 进行配置。一定要在命令行中使用ARCH=arm指定CPU架构,因为默认架构为主机的CPU架构,这一步需要根据目标机的实际情况进行详细的配置。 配置完成之后,需要将内核头文件拷贝到安装目录: cp -dr include/asm-arm $PREFIX/arm-linux/include/asm cp -dr include/linux $PREFIX/arm-linux/include/linux
4、第一次编译gcc configure的运行参数设置: --prefix=$PREFIX --target=arm-linux --disable-threads -disable-shared --enable-languages=c 执行make install,将生成一个最简单的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简单的gcc,它只需要具备编译目标机glibc库的能力即可。
5、交叉编译glibc 由于这一步生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。 又因为该过程要用到Linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其指向内核头文件所在的include目录;也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。
6、第二次编译gcc 运行configure 参数设置为: --prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。 运行make install。 到此为止整个交叉编译环境就完全生成了。 建立一个交叉编译工具链是一个相当复杂的过程,为了节省时间,网上有一些编译好的可用的交叉编译工具链可以下载。
作 业 1、2、3、6、7、10 常用的几条Linux命令: 1、ls 2、cat , more , less 3、cd 4、cp 5、rm 作 业 1、2、3、6、7、10 常用的几条Linux命令: 1、ls 2、cat , more , less 3、cd 4、cp 5、rm 6、mv 7、mkdir 8、rmdir
嵌入式软件开发工具 GNU(GNU is not UNIX)是由Richard Stallman开发的一个与UNIX兼容的软件系统。 大多数Linux软件是经过自由软件基金会FSF的GNU(www.gnu.org)公开认证授权的,因此通称为GNU软件。 GNU软件免费提供给用户使用,并被证明是非常可靠和高效,如GNU gcc编译器,GNU make项目管理器等。 gcc和make都是建立在内核基础上的开发工具和编译工具,其中,gcc是Linux程序开发的基础。
主要内容 5.1 GNU gcc编译器 5.2 GNU make工具
7.1 GNU gcc工具
7.1 GNU gcc工具 编译器的作用是将用高级语言或汇编语言编写的源代码翻译成处理器上等效的一系列操作指令。 针对嵌入式系统来说,编译器数不胜数。 gcc编译器和汇编器as是非常优秀的编译工具。
7.1.1 gcc简介 gcc是GNU C Complier的缩写。 Linux系统下的gcc是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作之一。 gcc可以在多种硬件平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比,平均效率要高20%-30%。 gcc编译器能将C、C++语言源程序、汇编语言程序和目标程序编译、链接成可执行文件。
7.1.1 gcc简介 gcc是通过后缀名来区别输入文件的类型,下面是gcc所遵循的部分约定规则。 .c为后缀的文件,C语言源代码文件; .a为后缀的文件,是由目标文件构成的档案库文件; .C,.cc或.cxx 为后缀的文件,是C++源代码文件; .h为后缀的文件,是程序所包含的头文件; .i 为后缀的文件,是已经预处理过的C源代码文件; .ii为后缀的文件,是已经预处理过的C++源代码文件; .m为后缀的文件,是Objective-C源代码文件; .o为后缀的文件,是编译后的目标文件; .s为后缀的文件,是汇编语言源代码文件; .S为后缀的文件,是经过预编译的汇编语言源代码文件。
7.1.2 gcc所包含的工具 cc C编译器 cpp C预处理器。编译器用它来将#include和#define 这类声明在源文件中展开。 gccbug 一个shell脚本,帮助创建有价值的bug报告。 gcov 覆盖测试工具,用来分析在程序的哪里做优化的效果最好。 libgcc gcc的运行时库 libstdc++ 准C++库,包含许多常用的函数。 libsupc++ 为C++语言提供支持的库函数。
7.1.3 gcc的执行过程 使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶ 预处理(也称预编译,Preprocessing) 编译(Compilation) 汇编(Assembly) 连接(Linking) 1、命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。
7.1.3 gcc的执行过程 2、接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。 3、汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。 4、当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
7.1.4 gcc的基本语法和选项 gcc最基本的用法是∶gcc [options] [filenames] -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。 -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。 -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。 -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
7.1.4 gcc的基本语法和选项 gcc基于命令行的。 当作为交叉编译工具使用时,gcc支持很多种的平台和“宿主机-目标机”的组合。 对应交叉编译,常用的命令就是arm-linux-gcc 。这样,当用C语言写好一个应用程序时,使用此命令就是以生成可以在目标平台上执行的可执行文件,通过超级终端执行后,就可以在目标板上看到程序的结果。
7.2 GNU make工具
7.2.1 GNU make工具 在大型的开发项目中,通常有几十个到上百个的源文件,如果每次均手工键入gcc命令进行编译,会非常不方便。 Linux专门为软件开发提供了一个自动化的管理工具GNU make。 make可以自动地更新和编译程序。make将整个软件项目的代码分开在几个小的源文件里,在改动其中一个文件的时候,可以只对该文件重新进行编译,然后重新连接所有的目标文件。
7.2.1 make概述 make依靠Makefile文件完成。 默认情况下,GNU make工具在当前工作目录中按如下顺序搜索makefile:”GNU makefile” →”makefile” →”Makefile”。 在Linux系统中,习惯使用Makefile作为makefile文件。如果要使用其他文件作为makefile,则可利用下面make命令指令makefile文件:”#make –f Makefile.debug”。 Makefile是一个文本格式的数据库文件,包含一些规则,告诉make编译哪些文件,在什么条件下编译。
7.2.1 make概述 Makefile中的每条规则包括下面内容: 一个目标体(target):make最终需创建的对象。 包含一个或多个依赖体(Dependency)的列表,依赖体指明编译目标时需要用到的其它文件。 命令(Command)列表,指明从依赖体文件创建出目标对象所需要执行的命令。 样式: (注:每个命令行前必须是一个Tab字符) target: dependency [dependency[…]] command […]
7.2.2 实例--通过automake产生makefile文件 Makefile 基本构造虽然简单,许多刚开始学习写 Makefile 时会感到没有规范可循,而且常常会受限於自己的开发环境,只要环境变数不同或路径改一下,可能Makefile 就得跟着修改。 为了减轻程式设计师维护 Makefile 的负担,因此有了 Automake。 程式设计人员只需写一些预先定义好的巨集 (macro),交给 Automake 处理後会产生一个可供 Autoconf 使用的 Makefile.in 档。再配合利用Autoconf 产生的自动设定档 configure 即可产生一份符合 GNU Makefile惯例的 Makefile 了。
步骤一 1、编写一个简单的c程序 #cd /home #mkdir hello #cd hello #vi hello.c #include “stdio.h” int main() { printf(“hello GNU\n”); return 0; }
步骤二 #autoscan #ls autoscan.log configure.scan hello.c 2、用 autoscan 产生一个 configure.in 的雏型,执行 autoscan 后会产生一个configure.scan 的档案,我们可以用它做为 configure.in档的蓝本。 #autoscan #ls autoscan.log configure.scan hello.c
步骤三 3、configure.scan包含了系统配置的基本选项,里面都是一些宏定义,我们需要对它进行编辑。此外,我们需要将它改名为configure.in #vi configure.scan 主要内容: AC_INIT(hello.c) #原型AC_INIT(FILE) ,这个宏用来检查源代码所在的路径。 AM_INIT_AUTOMAKE(hello,1.0) #这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本。PACKAGE是软件包的名字,VERSION是版本号。当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对应的软件包的名字和版本号。 AC_PROG_CC #这个宏将检查系统所用的C编译器。 AC_OUTPUT(Makefile) #这个宏是我们要输出的Makefile的名字。 #mv configure.scan configure.in #configure.in是configure脚本的输入文件。
步骤四 4、执行 aclocal 和 autoconf ,分别会产生 aclocal.m4 及 configure 两个档案 。 aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。 autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。 #aclocal #autoconf
步骤五 4. 编辑 Makefile.am 档 #vi Makefile.am AUTOMAKE_OPTIONS= foreign bin_PROGRAMS= hello hello_SOURCES= hello.c automake会根据你写的Makefile.am来自动生成Makefile.in。
步骤五 AUTOMAKE_OPTIONS 这个是automake的选项。在执行automake时,它会检查目录下是否存在标准GNU软件包中应具备的各种文件,例如AUTHORS、ChangeLog、NEWS等文件。我们将其设置成foreign时,automake会改用一般软件包的标准来检查。 bin_PROGRAMS 这个是指定我们所要产生的可执行文件的文件名。如果你要产生多个可执行文件,那么在各个名字间用空格隔开。 helloworld_SOURCES 这个是指定产生“helloworld”时所需要的源代码。如果它用到了多个源文件,那么请使用空格符号将它们隔开。比如需要helloworld.h,helloworld.c那么请写成helloworld_SOURCES= helloworld.h helloworld.c。
步骤六 6、执行 automake --add-missing ,Automake 会根据 Makefile.am 档产生一些档案,包含最重要的 Makefile.in 。 #automake - -add-missing #选项“” --add-missing ,会让automake加入一个标准的软件包所必须的一些文件。
步骤七、八、九 7、最后执行“./configure”,产生Makefile。 #./configure 9、执行可执行文件 #./hello Hello GNU!
Makefile的预定义操作 make clean 清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。 make install 将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。 make dist 产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。 它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
Makefile的预定义操作 make distcheck 生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。 ===========================================helloworld-1.0.tar.gz is ready for distribution =========================================== make distclean 类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。