博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

第二周课堂实践

Posted on 2017-09-27 23:01  20155217杨笛  阅读(153)  评论(1编辑  收藏  举报

Test 1

  • 0.每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
  • 1.用Vi输入图中代码,并用gcc编译通过
  • 2.在Vi中使用K查找printf的帮助文档
  • 3.提交vi编辑过程截图,要全屏,包含自己的学号信息

出现的问题:

Test1在做的过程中没有遇到问题,只是当时被一堆warning吓到,检查询问了很多人最后才放心。

运行结果截图如下:

Test 2

  • 1.用gcc 进行预处理,编译,汇编,链接vi输入的代码
  • 2.生成的可执行文件中要有自己的学号
  • 3.提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息

gcc的编译流程

  • 预处理阶段:头文件和宏定义,—E可以让gcc在预处理结束之后停止编译过程,因此可以看到预处理的过程,其一般格式为:gcc [选项] 要编译的文件 [选项] 目标文件gcc -E hello.c -o hello.i

  • 编译阶段:gcc将代码翻译成汇编语言,使用选项-S只进行编译而不进行汇编,结果生成汇编代码gcc -S hello.i -o hello.s

  • 汇编阶段:将.s文件转成目标文件,使用选项-c可以看到汇编代码转换为二进制目标代码gcc -c hello.s -o hello.o

  • 链接阶段:默认搜索链接到libc.so.6函数库当中,调用库文件中已经实现的函数。

  • 运行:./hello

出现的问题:

在操作之前录入的.c文件过程中,同样出现了警告;对链接阶段的函数库运用的不熟练,以至于不知道该怎样继续输入命令行。

运行结果截图如下:

Test 3

  • 1.用gcc -g编译vi输入的代码
  • 2.在main函数中设置一个行断点
  • 3.在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
  • 4.提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

GDB最基本的命令有:

  • gdb programm(启动GDB)
  • b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
  • run 开始运行程序
  • bt 打印函数调用堆栈
  • p 查看变量值
  • c 从当前断点继续运行到下一个断点
  • n 单步运行
  • s 单步运行
  • quit 退出GDB
其他:
  • display 跟踪变量值的改变
  • until 跳出循环
  • finish 跳出函数
  • help 帮助

设置断点

  • 函数:b 文件名.c:函数名
  • 行:b 行数
  • 条件:b 行数 if 表达式(例如:b 9 if == 12)
  • 临时:tb [文件名:]行号或函数名 <条件表达式>

实践过程

gcc -g *.c -o main
gdb main
b main
b 6 if i==2608
info break
r
q

*需要注意的是:需要在main.c文件中设置一个for的空循环,并查清设空的行数

出现的问题:

开始设置for空循环的时候,只是将大括号的位置错开,并未留出空行;其次是之前并没有安装成功gdb,耽误了时间。

运行结果截图如下:

image

Test 4

    1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
    1. 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

静态库

  • 静态库是一系列的目标文件(.o文件)的归档文件((lib+name).a文件);链接阶段,选择静态库,后缀名为“.a”,选择动态库,后缀名为“.so”

  • 静态链接库的生成:
    gcc -c 文件名.c ar rcsv libxxx.a xxx.o

  • 静态库的使用:gcc -o 文件名 文件名.c -L. -lxxx

实践过程:

ar cr math.a add.o sub.o mul.o div.o
gcc main.c ./math.a -o main

运行结果截图如下:

image

Test 5

  • 1.除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
  • 2.提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

动态库

  • 共享库的生成:gcc -fPIC -c xxx.c gcc -shared -o libxxx.so xxx.o

  • 共享库的使用:gcc -o main main.c -L. -lxxx

实践过程:

生成:

gcc -fPIC -c add.c sub.c mul.c div.c
gcc -shared -o libmymath.so add.o sub.o mul.o div.o

使用:

gcc -o main main.c -L. -lmymath

运行结果截图如下:

image

Test 6

  • 1.写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath,只用显式规则就可以
  • 2.提交Make过程截图,要全屏,包含自己的学号信息

Makefile

  • 一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。其带来的好处就是——“自动化编译”,一但写好,只需要一个make命令,整个工程完全编译,极大的提高了软件的开发效率。

  • makefile文件编写规则:

目标文件 :由make创建,通常是目标文件或可执行文件

依赖文件 :创建目标体所依赖的文件

运行命令 :创建每个目标体时需要的运行命令,必须以tab键开头,格式为:目标文件:依赖文件列表 [tab键]各目标体运行命令(注意不是空格)

  • 使用make的格式:make 目标文件

实践过程:

  • 输入vim Makefile,输入i进入编辑模式,输入代码并保存
编写的Makefile文件内容:
testmymath: main.o add.o sub.o mul.o div.o

gcc main.o add.o sub.o mul.o div.o -o testmymath

main.o: main.c head.h

gcc -c main.c

add.o: add.c head.h

gcc -c add.c

sub.o: sub.c head.h

gcc -c sub.c

mul.o: mul.c head.h

gcc -c mul.c

div.o: div.c head.h

gcc -c div.c
  • 输入 make,进行自动化编译
  • 执行 ./testmymath查看结果

运行结果截图如下:

image