20155302 第二周课堂实践

课堂测试未提交题目

三.

  1. 用gcc -g编译vi输入的代码
  2. 在main函数中设置一个行断点
  3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点

编译代码:gcc -g *.c -o main

给main设置行断点:b main

某一行设置行断点: b 行号

条件断点:b 行号 if 条件

课下的成功实践:

课上错误原因:一方面是只是机械的按照老师给的代码敲进去而没有注意头文件库的调用,导致很多东西找不到,另一方面就是在建立空循环时,代码编写有错误导致循环无法按照要求输出。于是在这道题上耽搁了太多时间,还是始终不行,也影响了下面的题目提交。

四.

1.除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?

首先gcc -c add.c sub.c mul.c div.c-c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件,一般是.o文件。

然后ar rcvs libmymath.a add.o sub.o mul.o div.o建立静态库。

最后gcc main.c -o main -L. -lmymath 调用静态库。

课下的成功实践:

五.

  1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?

与静态库类似的建立并运行动态库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

注意:libmymath.so 要拷贝到/lib or /usr/lib

课下的成功实践:

myod的实现

1 复习c文件处理内容

2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能

3 main与其他分开,制作静态库和动态库

前期准备:

od的作用:输出文件内容。用户通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。

d 十进制
o 八进制(系统默认值)
x 十六进制
n 不打印位移值

简而言之,od功能就是打开文本文件把其中的内容的十进制/八进制/十六进制ASCII码打印出来,并且一一对应。

代码编写思路:

使用FILE定义类型, FILE *file=fopen来读取文件,而后引入函数,子函数部分实现打印每个字符的ASCII码值,利用循环每十六个字符一行,字符到达EOF之前一一对应打印。

代码:

#include<stdio.h>

int main(int argc,char *argv[])
{
FILE *file=fopen(argv[3],"r");
ascii(file);
return 0;
}
void ascii(FILE *file)
{
char ch;
ch=fgetc(file);
char c[18];
while(ch!=EOF)
{
    for(int i=0;i<=16;i++)
    {
        ch=fgetc(file);
        c[i] = ch;
        printf("%3c",c[i]);
    }
    printf("
");
    for(int i=0;i<=16;i++)
    {
        printf("%3x",c[i]);
    }
    printf("
");
}
 fclose(file);
}

运行截图:

实验中遇到的问题:

1.

最开始的时候在运行的时候遇到的问题,由于最开始代码是在Windows系统下的codeblock软件下运行成功的,于是我就将代码按照gcc规则敲了进去,但是由于头文件的原因产生的错误。不仅要有#include<stdio.h>头文件还要有#include<stdlib.h>,添加了这两个头文件库,解决了此问题。

2.

这是我在运行静态库时候遇到的问题,编译、运行以及建库都没问题但是运行库时就出现这种问题,多次试验仍然无法解决,问了班里多名同学,狄惟佳、陆忠民等同学(大佬),但是他们表示没有遇见过这类错误,但是文件直接执行时就可以,调用静态库就不行。

3.

如图,我的代码实现起来与od还是存在很大差距的,但是限于我的目前编程水平,我也只能做到这种地步了。。

Makefile

1 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.

2 提交Make过程截图,要全屏,包含自己的学号信息

首先vim 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运行就好了。

运行截图:

原文地址:https://www.cnblogs.com/STILLlover521/p/7615499.html