GCC程序编译
简介
1. Linux系统下的gcc功能功能强大、性能优越的多平台编译器。Gcc可以在多种硬件平台上编译出可执行程序,其执行效率与一般编译器相比平均效率要高20%~30%。
2. GCC编译器能将C、C++语言源程序、汇编程序编译、链接成为可执行文件。
3. 在linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。
4. 使用GCC编译程序时,编译过程可以被细分为四个阶段:
(1) 预处理(Pre-Processing)(处理以#开头)
(2) 编译(Compiling) (编译成汇编文件)
(3) 汇编(Assembing) (编程目标文件)
(4) 链接(Linking) (把没目标文件连接在一起)
文件类型:
GCC通过后缀来区分:输入的类型
基本用法:
Gcc最基本的用法是:
Gcc [options] [filename]
Options :编译器所需要的编译选项
Filenames: 要编译的文件名。
编译选项:
Gcc编译器的编译选项大约有100多个,其中多数我们根本用不到,这里只介绍其中最基本、最常用的参数。
(1) –o output_filename: 确定可执行文件的名称为output_filename.
如果不给出-o这个选项,gcc就给出预设的可执行文件a.out
(2) –c :只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。
(3) –g :产生调试工具(GUN的gdb)所必须的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。
(4) -o,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。
(5) –o –o ,比-o更好的优化编译、链接,当然整个编译】链接过程会更慢。
例如:A. gcc optimize.c -o optimize
命令:time ./optimize
B. gcc -o optimize.c -o ptimize
命令:time ./optimize
对比两次执行的输出结果,可以看到程序性能B(1.5s)的确比A(6s)的快很多
(6) -I 路径名:将路径名所指出的目录加入到程序头文件目录列表中。
(增加头文件按的寻找路经)
C程序中头文件包含两种情况:
I.#include <A.h>
II. #include “A.h“
对于<>,预处理程序cpp会在系统预设的头文件目录(头文件标准寻找路径)中搜寻相应的文件;
对于““,cpp会在当前目录中搜寻头文件。这个选项的作用是告诉cpp,如果在当前目录中没有找得到需要的文件,就到指定的路径名目录中去寻找。
例:gcc hello.c -I /home/include -o hello (增加头文件寻找路径,此命令,寻找头文件时也到/home/inlude目录下寻找)
当把/home/1.h也作为头文件的标准寻找路径则可以#include <1.h>,怎样实现当把/home/1.h也作为头文件的标准寻找路径?
答:gcc file.c -I /home/include –o file
等效:#include“/home/include”
(7) -L 路径名:将路径名所指出的目录加入到库文件的目录列表中。在默认状态下,连接程序 ld在系统的预设中(如:/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到 –L指定的目录中去寻找,然后再到系统预设路径中寻找。
例如: gcc hello.c -L /home/lib –o hello
(8) –l 函数库
在连接时,装载名字为“lib函数库名,例如:libname.a,该函数库位于系统预设的目录或者由 –L选定的目录下。
例如:, -lm 表示:连接名为“libm.a“(lib去掉,后面的后缀.a去掉)剩下m再l+m=lm的数学函数库
例如:gcc hello.c -lm -o hello
-static :静态链接库文件
例:gcc -static hello.c -o hello
库有动态和静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:
Libhello.so libhello.a 当使用静态库时,连接器找出程序所需的函数,然后将它们考贝到可执行文件,一旦连接成功,静态库也就不再需要了。然而,对动态库而言,就不是这样,动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作时首先连接动态库。
(9)① -Wall:生成所有警告信息
② -w: 不生成任何警告信息
③ -D MACRO:定义MACRO宏,等效于在程序中使用#define MACRO
GDB程序调试
简介
GDB是GNU发布的一款功能强大的程序调试工具。
GDB主要完成下面3方面的功能:
1. 启动被调试的程序;
2. 让被调试程序在指定的位置停住。
3. 当程序被停住时,可以检查程序中状态(如:变量值)
GDB快速进阶
1. 编译生成可执行文件:(注意要调试编译出来的程序一定要加 –g)
gcc -g test.c -o test
2. 启动GDB
gdb 执行程序名
3. 在main函数处设置断点
break main
4. 运行程序
run
5. 单步执行
next
6. 继续运行
continue
GDB命令
(1) (list) l:查看程序
(2) (break) b函数名: 在某函数入口处添加断点
(3) (break) b行号:在指定文件的指定行添加断点
(4) (break) b文件名:行号 再指点文件名的指定行添加断点
(5) (break) b行号if条件 当条件为真时,指定行号处断点生效;
例如: b 5 if i=10,当i等于10时第5行断点生效
(6) info break :查看所有设置的断点
(7) delete断点编号:删除断点
(8) (run) r :开始运行
(9) (Next) n :单步运行程序(不进入子函数)
(10) (step) s :单步运行程序 (进入子函数)
(11) (Continue) c:继续运行程序
(12)(printf) p 变量名:查看指定变量值
(13)finish :运行程序,直到当前函数结束
(14)watch 变量名:对指定变量进行监控
(15)(quit ) q :退出 gdb