GCC编程
linux 系统下的GCC是GNU推出的功能强大、性能优越的平台编译器,是GNU的代表作之一。
GCC编译器能将C、C++语言源程序、汇编程序编译、连接成可执行文件,在linux系统中,可执行文件没有后缀,系统从文件的属性来区分可执行文件和不可执行文件。
使用GCC编译程序时,编译过程可以分为四个阶段:
*预处理(pre-processing)
*编译(compiling)
*汇编(assembling)
*连接(lingking)
GCC通过后缀来区别输入文件的类别:
*.c -------: C语言源代码文件
*.a-------: 是由目标文件构成的库文件
*.C,.cc或.cxx-----: 是C++元代码文件
*.h------: 头文件
*.i------: 是已经与处理过的C源代码文件
*.ii-----: 是已经处理过的C++源代码文件
*.o-----: 是编译后的目标文件
*.s-----: 是汇编语言源代码文件
*.S----: 是经过预编译的汇编语言文件源代码
基本用法
gcc最基本的用法是::
gcc [options] filename
options : 编译器所需要的编辑选项
filename: 要编译的文件名
gcc编译器中最常用的参数有
* -o output_filename : 确定可执行文件的名称为output_filename.如果不给出这个选项,gcc就给出预设的可执行文件a.out
* -c : 只编译,不连接成为可执行的文件,编译器只是由输入的.c等源代码文件生成。o为后缀的目标文件。
*-g :产生调试工具(GNU的gdb)所必须的符号信息,要相对编译出的程序进行调试,就必须加入这个.3选项。
*-o : 对程序进行优化编译、连接,采用这个选项,整个代码会在编译、连接过程中进行优化处理,这样产生的课执行效率可以更高,但是时间就要花费更多。
*-o2 : 比-o更好的优化编译、连接,当然整个编译、连接过程会更慢。
例程:optimize.c
输入:gcc optimize.c –o optimize
./optimize
即可得到运行结果,
再运行gcc –O optimize.c –o optimize 程序性能会得到大幅度的改善。
C程序中头文件包含两种情况:
#include
#include”B.h”
对于<> 预处理程序cpp在系统预设的头文件目录中搜寻文件;
对于“” 即cpp在当前目录中搜寻头文件,若在当前目录中没有找到需要的头文件,则 就到指定的dirname中去寻找。
Idirname:将dirname所指的目录加入到程序头文件目录列表中,
例:::
gcc foo.c –I/home/include –o foo
Ldirname : 将dirname所指出的目录加入到库文件的目录列表中。在默认的状态下,连接程序ld在系统的预设路径中需找需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再找到系统预设的路径中寻找。
-Wall : 生成所有警告信息
-w : 不生成任何告警信息。
-DMACRO : 定义MACRO宏,等效于程序中使用#define MACRO
GDB调试
GDB是GNU发布的一款功能强大的程序调试工具。主要功能:
1、 启动被调试程序。
2、 让被调试的程序在指定的位置停住。
3、 当程序被停住时,可以检查程序状态,如 变量值
调试要生成调试文件所以在编译时所用命令:
编译生成可执行文件:
gcc –g tst.c –o tst
启动GDB
gdb tst
在main函数出设置断点
break main (或者 b main)
运行程序:
run
输入 next 单步调试
输入continue 连续执行到最后。
GDB命令
l list(l) --------------------查看程序,以便增加断点
l break(b) 函数名---------在函数入口处添加断点
l break(b) 行号------------在指定行添加断点
l break(b) 文件名:行号—在指定文件指定行添加断点
l break(b) 行号if条件----当条件为真时,指定行号处断点生效,
例: b 5 if i=10 即当i=10 时第五行断点生效
l info break ---------查看所有设置的断点
l delete 断点编号----删除断点
l run(r)-----------开始运行程序
l next(n)---------单步运行程序(不进入子函数)
l step(s)----------单步运行程序 (进入子程序)
l continue(c)-----继续运行程序
l print(P)变量名----查看指定变量值
l finish ---------------运行程序
l watch 变量名-----对指定变量进行监控
l quit(q)----------退出gdb 调试
GNU make
Linux 程序员 必须学会使用GNU make来构建和管理自己的软件工程。GNU的make能够使整个软件工程的编译、连接只需要一个命令就可以完成
makefile
make 在执行时,需要一个命令为makefile的文件。makefile文件描述了整个工程的编译,连接等规则。其中包括:工程中的那些源文件需要编译以及如何编译,需要创建那些库文件以及如何创建,如何产生最后我们想要的可执行文件。
makefile(术语)
规则:用于说明如何生成一个或多个目标文件,(规则灰常重要)
规则格式:::
targets:prerequisites
command
目标:依赖
命令
例:main.o:main.c
gcc –c main.c
*****命令需要以tab键开始*******
在 makefile中,规则的顺序是很重要的,因为,makefile中只应该有一个最终目标,其他的目标都是被这个目标连带出来的,所以一定要让makefile知道你的最终目标是神马, 一般来说,定义在makefile中的目标可能会有很多,但是第一条规则中的目标被却定位最终目标
make命令默认在当前目录下寻找名字为makefile或者makefile的工程文件,当名字部位这两者之一时,可以使用如下方法指定:
make –f 文件名
伪目标:
Makefile 中 把那些没有任何依赖只有执行动作的目标称为“伪目标”(phony targets)
例:
.PHONY:clean
clean:
rm –f hello main.o func1.o func2.o
“.PHONY”将“clean”目标声明为伪目标
变量
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o –o hello
思考::若要为hello目标添加一个依赖,如:func3.o ,该如何修改
答案1:
hello:main.o func1.o func2.o func3.o
gcc main.o func1.o func2.o func3.o –o hello
答案2::
obi=main.o func1.o func2.o func3.o
hello:$(obj)
gcc $(obj) –o hello
在makefile中,存在系统默认的自动化变量
*$^---------代表所有的依赖文件
*$@-------代表目标
*$<--------代表第一个依赖文件
makefile中“#”字符后的内容被注释掉
@:取消回显