20155222 第二周测试
-
1 vi
- 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
- 用Vi输入图中代码,并用gcc编译通过
- 在Vi中使用K查找printf的帮助文档
- 提交vi编辑过程截图,要全屏,包含自己的学号信息
遇到问题:
1.头文件的命名中不能带有下划线
2.gcc -c 命令中的c必须是小写 -
2 gcc测试
- 用gcc 进行预处理,编译,汇编,链接vi输入的代码
- 生成的可执行文件中要有自己的学号
- 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息
遇到问题:将main.o文件链接为可执行文件必须同时链接其依赖的add.o、sub.o、mul.o、div.o文件
-
3 gdb测试
- 用gcc -g编译vi输入的代码
- 在main函数中设置一个行断点
- 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
- 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
附gdb调试指令:
l -- l命令相当于list,从第一行开始例出原码
回车 -- 直接回车表示,重复上一次命令
break n -- 设置断点,在源程序第n行处
break func -- 设置断点,在函数func()入口处
info break -- 查看断点信息
r -- 运行程序,run命令简写
n -- 单条语句执行,next命令简写
c -- 继续运行程序,continue命令简写
p i -- 打印变量i的值,print命令简写
bt -- 查看函数堆栈
finish -- 退出函数
q -- 退出gdb -
4 静态库的测试
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
- 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
静态库是一些目标文件(后缀名为.o)的集合体。
静态库的后缀名是.a,对应于windows操作系统的后缀名为.lib的静态库。
可以使用ar命令来创建一个静态库文件。
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
gcc -c mul.c -o mul.o
gcc -c div.c -o div.o
ar rcs libmymath.a add.o sub.o mul.o div.o
会在当前目录下生成一个libtest.a静态库文件。-c表示只编译,不链接。再敲入以下命令进行链接
gcc –c main.c -o main.o
gcc -c static -o mymath_test main.o ./libmymath.a
- 5 共享库的测试
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
- 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
由于动态链接库函数的共享特性,它们不会被拷贝到可执行文件中。在编译的时候,编译器只会做一些函数名之类的检查。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须实用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址不无关代码(Position Independent Code (PIC))。
对gcc编译器,只需添加上 -fPIC 标签
gcc -shared -fPIC -o libmymath2.so add.c sub.c mul.c div.c
gcc -o mymath_test2 main.c ./libmymath2.so
-
6
1 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.2 提交Make过程截图,要全屏,包含自己的学号信息
Makefile的规则 :
在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。
target ... : prerequisites ...
command
...
...
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。遇到问题:mymath中命令行必须以Tab开头
main.c的编译不需要依赖HEAD.H??