一、GCC概述
1、GCC概述
一个c/c++程序从开始编码到生成二进制可执行文件至少要经过四个步骤。
(1)预处理:对源文件的宏进行展开。
(2)编译:将源程序编译成汇编文件。
(3)汇编:将汇编文件编译成机器码。
(4)链接:将目标文件和外部符号进行链接,生成可执行文件。
GCC在编译时根据输入文件类别和参数选项,可以分别完成上述四个步骤,产生对应的处理文件,也可以一次性完成所有步骤,直接生成可执行文件。
下面是一些GCC文件扩展名规范:
(1).c为后缀的文件,是C语言源代码文件。
(2).h为后缀的文件,是头文件。
(3).C,.cc,.cpp,.cp或.cxx为后缀的文件,是c++源代码文件。
(4).h为后缀的文件,是程序所包含得而头文件。
(5).i为后缀的文件,是已经预处理过的C源代码。
(6).ii为后缀的文件,是已经预处理过的c++源代码文件。
(7).m为后缀的文件,是object-c源代码文件。
(8).o为后缀的文件,是编译后的目标文件。
(9).s为后缀的文件,是汇编语言源代码。
(10).S为后缀的文件,是经过预编译的汇编语言源代码文件。
2.GCC使用方法
在使用GCC编译器的时候,我们必须给出一系列必要的参数选项和文件名称。
GCC最基本的用法是:gcc [options] [filenames]
其中options就是编译器需要的选项,filenames给出相关的文件名称。下面介绍基本的几个常用选项:(假设源程序文件名为test.c)
(1)无选项编译链接
用法:gcc test.c
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out
(2)选项-o
用法:gcc test.c -o test
作用:将test.c预处理、汇编、编译并廉洁成可执行文件test。-o选项用来指定输出文件的文件名。
(3)选项-E
用法:gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。
(4)选项-S
用法:gcc -S test.i
作用:将预处理输出文件test.i汇编成test.s文件
(5)选项 -c
用法:gcc -c test.s
作用:将汇编输出文件test.s编译输出test.o文件。
(6)无选项链接
用法:gcc test.o -o test
作用:将编译输出文件test.o链接成最终可执行文件。
(7)选项-O
用法:gcc -O test.c -o test
作用:使用编译优化级别编译程序。级别为1-3,级别越大优化效果越好,但编译时间越长。
(8)多源文件的编译方法
如果有多个源文件,基本上有两种编译方法(假设有两个源文件为test.c和testfun.c)
1、多个文件一起编译
用法:gcc testfun.c test.c -o test
作用:将testfun.c和test.c分别编译后链接成test可执行文件。
2、分别编译各个源文件,之后对编译后输出的目标文件链接。
用法:gcc -c testfun.c //将testfun.c编译成testfun.o
gcc -c test.c //将test.c编译成test.o
gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test
以上两种方法相比较,第一种方法编译时需要所有的文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
3、c程序调试
c程序的调试分为静态调试和动态调试。静态调试用在程序编译阶段查错并修正错误,它主要利用GCC编译器对语法错误的检查进行排错。
动态调试则用在程序运行阶段的错误检查与修正,适用于检查算法的错误、输入输出的错误等。
程序的动态调试需要借助调试工具,Linux系统包含了一个叫gdb(GNU DeBugger)的GNU调试工具。gdb是是一个用来调试C和C++程序的调试器,是一个交互式工具,工作在字符模式下。以下是gdb所提供的一些功能:
(1)设置断点。
(2)监视程序变量的值。
(3)程序的单步执行。
(4)修改变量的值。
为了使gdb正常工作,必须使用-g选项编译源文件,使程序在编译时包含调试信息。在命令行上键入gdb并按回车键就可以运行gdb。
进入gdb环境后,就可以输入相应的命令对程序进行调试。
(1)file:装入想要调试的可执行文件。
(2)kill:终止正在调试的程序。
(3)list:查看指定文件或者函数的源代码,并标出行号。
(4)next:单步执行,但不进入函数内部。
(5)step:单步执行而且进入函数内部。
(6)run:执行当前被调试的程序。
(7)quit:退出gdb环境。
(8)watch:监视一个变量的值而不管它何时被改变。
(9)print:查看变量或表达式的值。
(10)break:在代码里设置断点,这将使程序执行到这里时被挂起。
(11)make:不退出gdb就可以重新产生可执行文件。
(12)Shell:不离开gdb就执行Shell命令。
具体的gdb操作手册请参照:https://www.cnblogs.com/mister-lv/p/6022841.html