Lunix系统C语言编译
Table of Contents
gcc
Linux下的c编译器中,gcc是功能最强大、使用最广泛的软件。
gcc是(GNU Cmpiler Collection的简称),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。
gcc不仅功能十分强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。
gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比,平均效率要高20%~30%。
gcc支持编译的后缀名:
后缀名 | 对应语言 | 后缀名 | 对应语言 |
.c | C原始程序 | .ii | 已经经过预处理的C++原始程序 |
.C | C++原始程序 | .s | 汇编语言原始程序 |
.cc | C++原始程序 | .S | 汇编语言原始程序 |
.cxx | C++原始程序 | .h | 预处理文件(头文件) |
.m | Objective-C原始程序 | .o | 目标文件 |
.i | 已经经过预处理的c原始程序 | .a/.so | 编译后的库文件 |
gcc指令的一般格式为:
gcc [参数] 要编译的文件 [参数] [目标文件]
gcc 1-2.c -o 1-2
gcc编译流程:
- 编辑源码程序代码
- 预处理阶段:
gcc 1-3.c -o 1-3.i -E
- 编译阶段:
gcc 1-3.i -o 1-3.s -S
- 汇编阶段
gcc 1-3.s -o 1-3.o -c
- 链接阶段:完成链接后,gcc就可以生成可执行程序文件
注意:gcc在编译的时候默认使用动态链接库,编译链接时并不把库文件的代码加入到可执行文件中,而是在程序执行的时候动态加载链接库,这样可以节省系统开销。
总体参数
参数 | 含义 | 参数 | 含义 |
-c |
只是编译不链接 |
-v | 显示gcc的版本信息 |
-S | 只是编译不汇编,生成汇编代码 | -I dir | 在头文件的搜索路径中添加dir目录 |
-E | 只进行预编译 | -L dir | 在库文件的搜索路径列表中添加dir目录 |
-g | 在可执行程序中包含调试信息 | -static | 链接静态库 |
-o file | 把输出文件输出到file中 | -l libra | 连接名为library的库文件 |
当头文件与gcc不在同一目录下要用-I dir编译,它是指头文件,而添加库文件时需用-L dir参数。
Linux下的库文件命名时有一个规定:必须以l、i、b三个字母开头,因此,在用“-l”指定链接库文件时可以省去l、i、b三个字母。也就是说“-llibsunq”有时候写成“-lsunq”。
gcc的常用警告和出错参数
参数 | 含义 |
-ansi | 支持符合ANSI的c程序 |
-pedantic | 允许发出ANSI c标准所列的全部警告信息 |
-pendantic-error | 允许发出ANSI c标准所列的全部错误信息 |
-w | 关闭所有警告 |
-Wall | 允许发出gcc提供的所有有用的告警信息 |
-werror | 把所有的告警信息转化为错误信息,并在告警发生时终止编译 |
步骤 2:关闭所有告警
gcc 1-7.c –o 1-7 –w
步骤 3:显示不符合ANSI c标准语法的告警信息
gcc 1-7.c –o 1-7 –ansi
步骤 4: 允许发出ANSI c标准所列的全部警告信息
gcc 1-7.c –o 1-7 –pedantic
步骤 5:允许发出gcc提供的所有有用的告警信息
gcc 1-7.c –o 1-7 –Wall
优化参数
代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。
gcc提供的代码优化功能非常强大,它通过编译参数“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。
通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。
gcc 1-8.c –o 1-8 –O2
优化虽然能够给程序带来更好的执行性能,但在一些场合中应该避免优化代码。
- 程序开发的时候。
- 资源受限的时候。
- 跟踪调试的时候。
gdb
Linux下的gdb调试器,是一款GNU组织开发并发布的UNIX/Linux下的程序调试工具。它没有图形化的友好界面,但功能强大。
在进行应用程序的调试之前,要注意的是gdb进行调试的是可执行文件,而不是如“.c”这样的源代码文件。因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。
gcc 1-9.c –o 1-9 –g
gdb 1-9
常用的gdb命令
命令格式 | 作用 |
list<行号>|<函数名> | 查看指定位置的程序源代码 |
break 行号|函数名<条件表达式> | 设置断点 |
info break | 显示断点信息 |
run | 运行程序 |
print 表达式|变量 | 查看程序运行时对应表达式和变量的值 |
next | 单步恢复程序运行,但不进入函数调用 |
step | 单步恢复程序运行,且进入函数调用 |
continue | 继续执行函数,直到函数结束或遇到新的断点 |
用gdb调试程序
- 查看源文件
在gdb中输入“l”(list)就可以查看程序源代码,一次显示10行;
- 设置断点
在gdb中设置断点命令是“b”(break),后面跟行号或者函数名。
如:(gdb) b 10
- 查看断点信息
用命令“info b”(info break)查看断点信息。
注意:gdb在一个程序中可以设置多个断点,有多个断点中断时,“Num”处显示断点序号。
- 运行程序:输入“r”(run)开始运行程序。
注意:gdb默认从第一行开始运行,如果要从程序中指定行开始运行,只需输入“r”+行号。
- 查看变量值
程序运行到断点处会自动暂停,输入“p 变量名”.
调试程序时,可能需要修改变量值,程序运行到断点处时,输入“set 变量=设定值”,例如给变量“a2” 赋值11,输入“set a2=11”。
gdb在显示变量值时都会在对应值前加“$n”标记,它是当前变量值的引用标记,以后想再引用此变量,可以直接使用“$n”,提高了调试效率
注意:查看变量值,不能在程序结束后。
- 单步运行
在断点处输入 “n”(next)或者“s”(step) 。它们之间的区别在于:若有函数调用时,“s”会进入该函数而“n”不会进入该函数。
- 继续运行程序
输入“c”(continue)命令恢复程序的正常运行,把剩余的程序执行完,并显示执行结果。
- 退出gdb环境:输入“q”(quit)命令。