小白日志(三)
Linux系统开发工具及其使用(二)
gcc使用的基本语法:
gcc [选项] [文件名]
常用命令选项:
- -o filename :确定可执行文件的名字为filename,若不给出则gcc会给出预设名a.out
- -c :只作编译,由*.文件生成。
- -g :产生调试工具(gdb)所必要的符号信息,若想调试程序就加这个选项。
[ root@localhost home ]#gcc -g test.c -o test
- -O(0,1,2,3):对程序进行优化编译,链接,数字越大优化程度越高,优化程度越高编译的速度就越慢
需要注意的是:并不是所有的程序都要优化,有些情况下使用优化会把一些参数删除
[ root@localhost home ]#gcc -Otest.c -o test
补充命令选项:
- -DPI=3.14 :定义宏定义,在命令中需要加上赋值符号“=“
- -UD :取消宏定义
- -CE :在编译时不忽略注释信息
三、 GDB(调试器)
- 当输入启动调试命令语句后。会出现以下界面:
#gcc -g test.c -o test
#gdb test
GNU gdb Red Hat Linux (6.3.0.0-1.21rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb)
在gdb调试模式下常用命令(小白常用):
-
(gdb)l :查看源代码,运行一次命令显示10行代码
-
(gdb)l (空格) 行号 :可以从所选择的行开始显示
-
(gdb)b (空格) 行号 :在指定行设置断点
-
(gdb)b (空格) 函数名 :在指定函数的函数入口处设置断点
-
(gdb)b (空格) 行号 if (空格) 条件 :当条件为真时,在指定行号处设置断点
如:b 5 if i=10,当 i 变量等于10时第5行断点生效 -
(gdb) info (空格) b :显示当前断点信息
-
(gdb)delete (空格) 断点编号 :删除断点
-
(gdb)clear (空格) 行数 :删除指定行数的断点
-
(gdb)clear (空格) 函数名 :删除指定函数中的
-
(gdb)r :运行程序,(gdb)r (空格) 行号 可以指定从哪行开始运行程序
-
(gdb)p (空格) 变量名 :查看变量的值
-
(gdb)c :继续运行程序,直到碰到下一个断点或者程序运行结束
-
(gdb)s :单步调试,遇到函数调用时会流程转移至函数中执行
-
(gdb)finish :进入函数后中途可退出函数
-
(gdb)n :单步调试,遇到函数调用时省略函数的流程转移运行过程继续向下执行
四、make(工程管理器)
用于管理较多的文件 ,make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作 。
- makefile的编写规则:
1.由make工具创建目标体(target),通常为目标文件或可执行文件
2.创建目标体(target)所以依赖的文件
3.创建每个目标体时需要命令(command),以制表键TAB开头跟在目标体的下一行
基本格式:
目标体 :依赖文件
(制表键TAB)生成目标体的命令
注意:makefile中规则的顺序很重要,因为终极目标就只有一个,即可执行文件,其他目标都是附带出来的,一般第一条规则中的目标被认为是终极目标。
- 示例:
/*makefile*/
hello: main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
main.o : main.c
gcc –c main.c
func1.o : func1.c
gcc –c func1.c
func2.o : func2.c
gcc –c func2.c
.PHONY : clean //伪目标声明
clean :
rm –f hello main.o func1.o func2.o
- makefile文件编写完成后,只需输入make即可完成编译:
[ root@localhost home ]#make
gcc –c hello.c func1.c func2.c –o main.o func1.o fun2.o
[ root@localhost home ]#ls
main.c fun1.c fun2.c main.o func1.o func2.o makefile hello
注意:make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:make (空格) –f (空格) 文件名
- 实例代码中出现的“ .PHONY : clean ”是一个伪目标声明,makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”。
当make (空格) 伪目标名 可以执行伪目标下的命令:
[ root@localhost home ]#make clean
[ root@localhost home ]#ls
main.c fun1.c fun2.c makefile
在makefile中,存在系统默认的自动化变量
$^:代表所有的依赖文件
$@:代表目标
$<:代表第一个依赖文件
例:
hello: main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
->
hello: main.o func1.o func2.o
gcc (空格) $^ (空格) -o (空格) $@
用户自己也可以设置变量
obj=main.o func1.o func2.o func3.o
hello: $(obj)
gcc $(obj) -o hello
这样文件较多的时候就大大简化了编写makefile的复杂度