Lunix系统C语言编译

Table of Contents

 

gcc

gcc编译流程:

总体参数

gcc的常用警告和出错参数 

优化参数

gdb

常用的gdb命令

用gdb调试程序


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编译流程:

Lunix系统C语言编译

 

  • 编辑源码程序代码
  • 预处理阶段:
    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)命令。