20155222 第二周测试

20155222 第二周测试

  • 1 vi
    0. 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号

    1. 用Vi输入图中代码,并用gcc编译通过
    2. 在Vi中使用K查找printf的帮助文档
    3. 提交vi编辑过程截图,要全屏,包含自己的学号信息

    遇到问题:
    1.头文件的命名中不能带有下划线
    2.gcc -c 命令中的c必须是小写

  • 2 gcc测试

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

    遇到问题:将main.o文件链接为可执行文件必须同时链接其依赖的add.o、sub.o、mul.o、div.o文件

  • 3 gdb测试

    1. 用gcc -g编译vi输入的代码
    2. 在main函数中设置一个行断点
    3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
    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 静态库的测试

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

    静态库是一些目标文件(后缀名为.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 共享库的测试
  1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
  2. 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

    由于动态链接库函数的共享特性,它们不会被拷贝到可执行文件中。在编译的时候,编译器只会做一些函数名之类的检查。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须实用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址不无关代码(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??

posted @ 2017-09-30 21:42  20155222卢梓杰  阅读(187)  评论(0编辑  收藏  举报