Linux下gcc的使用

一、编译器gcc的使用

  •  在home目录下新建文件夹exp5,将linkstack.h linkstack.c 和main.c 复制到exp目录

Linux下gcc的使用

Linux下gcc的使用

Linux下gcc的使用

  •  编译linkstack.c 和main.c文件,使用链接选项 -o直接生成可执行文件,并观察exp5目录下内容的变化。

gcc main.c linkstack.c –o main

Linux下gcc的使用

  • 运行main,输入5,记录下运行结果。

Linux下gcc的使用

  • 添加编译选项-Wall,重新编译并运行。观察编译提示,说明添加-Wall选项的作用,并说明警告是否影响了输出结果。

Linux下gcc的使用

Linux下gcc的使用

添加-Wall选项的作用:显示程序编译过程中产生的所有警告,而警告并不会对输出结果产生影响。

  • 在home目录下新建文件夹temp,将exp5目录下linkstack.h和linkstack.c复制到temp目录,并且删除exp5目录下linkstack.h和linkstack.c

Linux下gcc的使用

  • 分别编译linkstack.c 和main.c文件,注意两个文件时需要编译选项-c生成.o目标文件,同时编译main.c时需要通过编译选项 -I 指出头文件linkstack.h的路径,注意比较没有指出头文件路径的错误提示。

Linux下gcc的使用

Linux下gcc的使用

  • 链接main.o和linkstack.o生成可执行文件main,并运行main。

Linux下gcc的使用

  • 删除main.o、linkstack.o和main

Linux下gcc的使用

  • 在test目录下编译linkstack.c,并打包成一个静态库liblinkstack.a

Linux下gcc的使用

  • 编译main.c生成可执行文件。注意需要设置编译选项-L告诉编译器到哪里找需要的库文件,设置编译选项-I告诉编译器到哪里找需要的头文件。注意即使库文件在当前目录,也要告诉编译器L.

gcc main.c –L ../test/ -llinkstack –o main

Linux下gcc的使用

  • 删除编译后的文件,只保留原始的.c和.h文件,设置优化等级选项-On,要求优化等级为3级,并设置调试选项-g生成调试信息,重新编译,观察提示,并说明是不是优化等级越高越好。

Linux下gcc的使用

并不是优化等级越高越好,过高时,编译的时间会被延长,用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)

二、用GDB调试程序BUG

  • fact.c实现阶乘功能,编译运行程序fact.c,输入5,结果显示1,观察结果不正确;

Linux下gcc的使用

  • 重新编译gcc –g的选项编译这段代码;
  • 启动gdb调试程序  

Linux下gcc的使用

  • 列出源代码

Linux下gcc的使用

  • 在14行和19行设置断点

Linux下gcc的使用   

  • 执行程序 

Linux下gcc的使用

  • 查看断点

Linux下gcc的使用

  • 执行单步跟踪

Linux下gcc的使用

  • 打印num变量以观察代码执行情况

Linux下gcc的使用

Linux下gcc的使用

  • 分别执行step,执行cont,察看二者的区别
  • 退出调试

Linux下gcc的使用

  • 纠正错误,更改源程序并得到正确的结果。

Linux下gcc的使用

Linux下gcc的使用

三、编写包含多个文件的makefile

  • 已知工程proj包含3个源程序linkstack.h linkstack.c 和main.c,为其编写makefile文件。

1

2

3

4

5

6

7

8

9

10

11

12

main:main.o linkstack.o

gcc main.o linkstack.o -o main

 

main.o:main.c linkstack.h

gcc -c main.c

 

linkstack.o:linkstack.c linkstack.h

gcc -c linkstack.c

Linux下gcc的使用

  • 键入 make ,查看结果,对实验进行解析,说明其功能。

Linux下gcc的使用

功能解析:对文件夹里唯一一个makefile文件进行编译,是一条可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (or makefile) 这个文本文件,执行对应的操作。

  • 重新编写makefile

1

2

3

4

5

6

7

8

9

10

11

12

13

14

main:main.o linkstack.o

   gcc $^ -o [email protected]

 

main.o:main.c linkstack.h

linkstack.o:linkstack.c linkstack.h

 

clean:

   @echo "cleanning the project"

   rm *.o

Linux下gcc的使用

  • 键入 make ,查看结果,对实验进行解析,说明其功能。

Linux下gcc的使用

功能解析:对重新编写的make文件进行重新更新。make 会自动的判别原始码是否经过变动了,而自动更新执行档

  • 键入 make clean查看结果,对实验进行解析,说明其功能。

Linux下gcc的使用

功能解析:执行Makefile文件里的clean命令