编译工具

1
vim bar.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
int foo(int n);
void bar(int m);
int
main(void){
int a;
char *s = "hello, world";
printf("%s\n",&s[7]);
a = 5;
foo(a);
return 0;
}
int
foo(int n){
int b;
b = n;
b *=2;
bar(b);
return b;
}
void
bar(int m){
printf("hi,i am bar!\n");
}

gcc程序编译

1
gcc -g -Wall bar.c -o bar

编译可分为四个阶段:
1.预处理:宏定义,头文件
2.编译:c–>汇编语言
3.汇编:汇编成目标文件 .o (二进制文件)
4.链接:把所有的目标文件和库文件链接成一个可执行的文件

gcc 参数

-I /home/include:指定头文件路径,先找预设路径
-L /usr/lib:库文件路径,先找指定目录,再找系统预设路径
-lfun:库文件中指定函数库 libfun.a
-static:静态链接库文件 .a为后缀,将所需要的函数copy到执行文件中
而动态链接库以 .so为后缀 指明当程序执行时,首先必须载入这个库,缺省操作
-Wall:生成所有的警告信息
-g:产生调试工具所必须的
-c:只生成一个.o后缀的目标文件

gdb程序调试

1
gdb bar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
break main //内存中main函数的入口地址 b 行号 ,b 文件名:行号
run //r
list //l
print a //殘值而已,不是我们赋的值 p
print s //也是殘值 print &a next next next step next print &b
print s+90 //通过gdb 可以在内存中任意跳转
next //n
print s
next
print s[7]
print &s[7]
print a //残值
next
print a
step //进入foo子函数 s
next
next
print n
print b
step //进入bar函数
print m
continue //返回0 正常退出 c继续运行程序
b 5 if i=10 当i等于10时第5行断点生效
delete 断点编号 :删除断点
quit //q

Makefile工程管理

当有很多个文件都需要编译时,不可能一个一个的去gcc吧
通过make命令就能够使整个软件工程完成编译和链接
make在执行行,需要一个命名为Makefile的文件,它描述了整个工程的编译,链接等规则

Share Comments