在前面讲述了如何利用文本编辑器编写程序的源代码,本章将就程序的编译和调试进行讲解。
Shell是遵循一定的语法将输入的命令转换加以解释并传递给系统的命令行解释器,使用Shell用户可以很方便地启动、挂起、停止和编写程序。
Shell本身就是一个程序,它是用C语言编写的程序,但同时又是一种程序设计语言,并提供很多在高级语言中才具有的结构控制指令等。
目前流行的Shell有ash、bash、ksh等,用echo命令来查看$SHELL就可以知道你的Shell类型了。
Shell 命令行的输入是有一定规则的,在命令行中输入的第一个字必须是一个命令名,第二个参数是命令的选项和参数,这个要参照命令的语法。命令行中的每个字必须用空格或TAB隔开。在Shell中一行可以输入多个命令,每个命令之间用分号隔开,这些命令将按顺序执行。
(1)输入重定向:输入重定向是指把命令和可执行程序的标准输入重定向到指定的文档中。即输入不是来自键盘而是来自一个指定的文档。输入重定向的一般形式如下:
命令<文件名
(2)输出重定向:输出重定向是指把命令或可执行程序的标准输出重定向到指定的文档中。这时该命令或可执行程序的输出将被写入指定的文档中,而不会在屏幕上显示。
输出重定向的一般形式如下:
命令>文件名
(3)管道:管道可以实现命令间数据的传递,即将一个程序或命令的输出作为另一个程序或命令的输入。用管道连接起来的多个命令执行后在屏幕上显示的将是最后一个命令的执行输出。管道是通过在命令间加入管道符号“|”来实现的。
(4)Linux 的 Shell 编程:Shell 编程类似于 DOS 中的批处理文件,称为 Shell script。Shell程序有其自身的控制流程和函数定义格式,在Linux的命令行下可以使用Shell脚本进行程序的编译和调试。
因为Linux下的程序开发多为C语言,所以本章将以C语言的编译和调试为主。
学习目标 了解 autotools 工具中 autoconf 指令的基本功能
语法 autoconf [参数]
功能说明 autoconf 指令调用 m4 生成 Shell 脚本的配置文件,由 autoconf 生成的配置脚本在运行时与 autoconf 是无关的。autoconf 支持交叉编译,它需要使用 GNU m4 来生成脚本。由autoconf生成的配置脚本通常被称为configure,使用autoconf生成configure脚本,需要输入文件configure.in。在运行时configure会创建一些文件,在文件中将以适当的值替换配置参数。
参数说明 参数及其说明如下:

基础应用
范例691 生成的执行脚本。
[root@localhost ~]# autoconf //生成配置文件
执行指令“autoconf”生成configure配置文件。
学习目标 了解 autoheader 指令与 configure 文件产生的关系,学会使用 autoheader 指令用来产生模板头文件。
语法 autoheader [-可选参数] [模板文件]
功能说明 autoheader 指令是 autotools 工具,可根据给定的模板文件来生成模板的头文件,供configure文件使用。
参数说明 可选参数及其说明如下:


【autoheader警告信息列举】
obsolet:旧的架构。
all:所有的警告信息。
no-CATEGORY:关闭警告信息。
none:关闭所有的警告。
error:出现错误。
基础应用
范例692 生成模板头文件。
[root@localhost ~]# autoheader //生成头文件
执行指令“autoheader”将根据当前文件夹下的configure.in或configure.ac文件来生成相应的头文件。
实战思考
应用思考
使用 autoheader 指令于开发软件包或者安装相应的软件,使得当前文件夹下存在的configure.in或者configure.ac文件直接运行产生相应的头文件,为下一步的配置工作做准备。
学习目标 学会使用 autoreconf 指令来更新 configure 配置文件
语法 autoreconf [-可选参数] [文件]
功能说明 autoreconf 指令是 autotools 工具,可以对以前编译的配置文件进行重复编译。
参数说明 可选参数及其说明如下:


【autoreconf警告信息列举】
obsolet:旧的架构。
all:所有的警告信息。
no-CATEGORY:关闭警告信息。
none:关闭所有的警告。
error:出现错误。
基础应用
范例693 更新已生成的执行脚本。
[root@localhost ~]# autoreconf //更新配置文件
执行指令“autoreconf”可重新编译configure配置文件。
学习目标 学会使用 autoscan指令来生成 configure.in 模板文件
语法 autoscan [-可选参数] [源目录]
功能说明 autoscan指令是autotools工具,可根据目录下的源文件来生成一个configure.in模板文件。
参数说明 可选参数及其说明如下:

基础应用
范例694 生成configure.in模板文件。
[root@localhost ~]# autoscan //生成configure.in文件
学习目标 了解 autoupdate 指令与 configure.in 文件的关系,学会使用 autoscan指令来更新configure.in文件。
语法 autoupdate [-可选参数] [模板文件]
功能说明 如果给定模板文件,如 configure.in 或者 config ure.ac,那么 autoupdate 指令将更新configure.in文件,语法标准参考当前版本autoconf的语法标准。autoupdate支持对原始的、没经过编译的文件进行编译。
参数说明 可选参数及其说明如下:

基础应用
范例695 更新configure.in文件。
[root@localhost ~]# autoupdate //更新已有的configure.in文件
执行指令“autoupdate”将对之前使用autoscan指令生成的configure.in模板文件进行更新。
学习目标 了解 gcc 的编译过程,熟练掌握 gcc 指令编译 C 和 C++程序的方法
语法 gcc[参数][文件名]
功能说明 gcc(GNU Compiler Collection)是目前 Linux 下符合 ANSI C 标准的、最常用的C语言编译器。它通过四个阶段来实现程序编译的过程,预处理、编译、汇编以及链接。它功能强大,能够通过不同的前端模块来支持各种语言。
【gcc 支持的语言列举】
.c:c 语言程序。
.C 或.cc:C++源程序。
.m:Objective-C 源程序。
.i:预处理后的 c 程序。
.ii:预处理后的 c++程序。
.s 或.S:汇编语言程序。
.h:头文件。
.o:目标文件。
.a:静态链接库。
.so:动态链接库。
参数说明
可选参数及其说明如下:


基础应用
范例696 文件编译。
[mary@localhost c]$ gcc -o skfile.c //编译文件
[mary@localhost c]$
执行指令“gcc -o skfile.c”将生成名为 a.out 的可执行文件,输入指令“./a.out”就可以运行这个可执行文件。用户也可以用如下方法来自己指定输出的可执行文件的名称,然后运行该文件。
[mary@localhost c]$ gcc -o skfile skfile.c //编译文件
[mary@localhost c]$
执行指令“gcc -o skfile skfile.c”将生成名为 skfile 的可执行文件。这时,用户就可以通过在命令行中输入“./skfile”来执行该文件。
范例697 文件编译。
[mary@localhost c]$ gcc –E skfile.c -o skfile.i //预编译
[mary@localhost c]$ gcc –c skfile.i -o skfile.o //生成目标文件
[mary@localhost c]$ gcc skfile.o -o skfile //生成可执行文件
[mary@localhost c]$
在上例中通过单步编译,先将C语言源程序进行预编译,然后对预编译后的.i进行编译,生成目标文件,最后生成可执行文件。它实现的功能与直接输入范例522中的指令来实现的功能相同,gcc 指令在编译源程序时,也是先调用预处理程序对源文件进行展开,接着调用as和ccl来将进行预处理后的源文件编译成目标文件,然后gcc指令会调用ld链接程序把目标文件链接成一个可执行程序。
范例698 指定搜索库的路径。
[mary@localhost c]$ gcc skfile.c –L /home/mary/Lib -o skfile //编译文件同时指定搜索库路径
[mary@localhost c]$
学习目标 学会使用 gdb 指令进行跟踪调试
语法 gdb [可执行程序名]
功能说明 gdb 是 GNU 发布的一个 Linux/UNIX 下的调试工具,使用 gdb 可以观察程序运行时的内部结构和内存使用情况。现将gdb的一些功能列举如下:设置断点以使程序在指定的代码行上停止执行;监视程序中变量的值;动态地改变程序的执行环境;按照用户的定义运行程序,可以一行行地执行代码。
参数说明 gdb 的内置命令及其说明如下:


基础应用
范例699 启动gdb调试器。
[mary@localhost pro]$ gdb //启动gdb
GNU gdb Fedroa (6.8-29.fc10)
Copyright(C) 2008 Free Software Foundation, Inc.
Lincense GPLv3+:GNU GPL version 3 or later http://gnu.org/lincenses/gpl.html
This is free software:you are free to change and redistribute it .
There is NO WARRANTY,to the extent peeermitted by law.Type “show copying” and “show warranty”for
details.
This GDB was Configured as”i 386-redhat-linux gnu”.
(gdb)help
List of classes of commands:
aliases –-Aliases of other commands
breakpoints -–Making program stop at certain points
data –-Examining data
files –-Specifying and examining files
internals –-Maintenance commands
obscure –-Obscure features
running –-Running the program
stack –-Examining the stack
status –-Status inquiries
support –-Support facilities
tracepoints –-Tracing of program execution without stopping the program
user-defined –-User-defined commands
Type “help” followed by a class name for a list of commands in that class.
Type “help all” for the list of all commands.
Type “help” followed by command name for full documentation.
Type “apropos word” to search for commands related to “word” command name abbrevitations are allowed if unambiguous.
(gdb)
在命令行下输入gdb指令回车,就可以运行gdb调试器,并在屏幕上输出以上所示内容和(gdb),这时用户可通过在提示的(gdb)后输入内建命令进行调试。
学习目标 了解 gdbserver 指令与 GNU 服务器的关系,学会使用 gdbserver 指令远端调试程序
语法 gdbserver [终端] [-可选参数] [进程号]
功能说明 gdbserver 指令可用来控制远端 gdb 服务器的程序调试。
参数说明 可选参数及其说明如下:

基础应用
范例700 运行远端调试程序。
[mary@localhost Prog]$ gdbserver tty2 --attend 519//远端程序调试
学习目标 了解 ld 指令的执行原理
语法 ld [-可选参数] [文件名]
功能说明 ld 指令可以将目标文件和库文件链接到一起,生成执行文件。在 gcc 命令中, gcc编译器会自动调用该程序。
参数说明 可选参数具体说明如下:


基础应用
范例701 目标文件链接。
[mary@localhost Prog]$ ld –o skfile /home/mary/Prog/corr.o am.o //文件链接
学习目标 了解make指令编译内核的过程,掌握使用make指令来进行内核安装的一般过程
语法 make [-可选参数] [makefile 文件]
功能说明 make 又称 GNU ,是 Linux 系统中的一种代码维护工具,它可以根据程序中各模板的更新情况以及相互间的依赖关系,来自动地维护目标代码。而文件或模块间的依赖关系是在makefile文件中进行定义的。
参数说明 可选参数具体说明如下:


基础应用
范例702 根据默认的makefile编译。
[root@localhost ~]# make
在命令行中直接输入make指令,程序将查找makefile文件,然后根据makefile文件中各模块或文件之间的依赖性进行编译。
范例703 根据指定的makefile文件编译。
[root@localhost ~]# make –f helo.mk
执行指令“make –f helo.mk”将指定的文件 helo.mk 作为 makefile 文件。
范例704 安装模块。
[root@localhost ~]# make fil_install
学习目标 了解nm指令的基本用法,能使用该指令来获取目标文件中的符号信息和属性
语法 nm [-可选参数] 目标文件
功能说明 nm 指令是 binutils 开发工具中的成员,它可用来输出指定模块文件中的符号表,即变量类型和数值。
【符号的类型】
A:符号值为绝对值,且不会被链接所改变。
B:未初始化数据。
C:公共符号。
D:已初始化数据。
I:符号的间接引用。
N:调试符号。
R:只读数据。
T:文本代码符号。
U:未定义符号。
W:弱定义符号。
-:stabs 符号用于保留调试信息。
?:未知类型的符号。
o:符号名。
参数说明 可选参数具体说明如下:

基础应用
范例705 显示指定目标文件的符号。
[root@localhost ~]# nm skfile.o //显示符号
U bin
00000000 T minus
U times
[root@localhost ~]#