20155208徐子涵 第二周课堂实践

第五题

题目要求

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

回答过程概括

  • 先在命令行输入gcc -shared -fpic -o math.so sub.c add.c mul.c div.c
  • 之后在输入gcc -o test5 main.c ./libcal.so
  • 最后输入 ./test5进行运行 运行结果如图:

代码上传截图:

码云链接

第二项

要求:

1 复习c文件处理内容

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

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

4. 编写Makefile

5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

6 在博客园发表一篇博客,重点写遇到的问题和解决过程

myod代码实现:

head.c
#ifndef _HEAD_H_
#define _HEAD_H_
void myod(FILE *file,int n1,int n2,int n3,int n4);
#endif


main.c
#include <stdio.h>

#include <stdlib.h>

#include"head.h"


int main(int argc,char *argv[])
{

    int i;
    int n1=0,n2=0,n3=0,n4=0;
    for(i=1;i<argc-1;i++)
    {
        switch(argv[i][2])
        {
            case 'c':n1=1;break;
            case 'x':n2=1;break;
            case 'd':n3=1;break;
            case 'o':n4=1;break;
        }
    }
    FILE *file=fopen(argv[argc-1],"r");
    if(file==NULL){printf("Error!\n");exit(0);}
    myod(file,n1,n2,n3,n4);
    return 0;
}

myod.c
#include<stdio.h>
void myod(FILE *file,int n1,int n2,int n3,int n4)
{
    char ch,line[16];
    int i;
    int j=0;
    while((ch=fgetc(file))!=EOF){
        line[j%16]=ch;
	if((j+1)%16==0){
        if(n1){for(i=0;i<16;i++)
        {
            if(line[i]=='\n')
            {printf("%5s","\\n");continue;}
	    if(line[i]=='\t')
            {printf("%5s","\\t");continue;}
            putchar(line[i]);
            putchar(' ');
            putchar(' ');
            putchar(' ');
            putchar(' ');
        }
        putchar('\n');}
        if(n2){for(i=0;i<16;i++)
        {
            if(line[i]=='\n')
            {printf("0%-4x",'\n');continue;}
	    if(line[i]=='\t')
            {printf("0%-4x",'\t');continue;}
            printf("%-5x",line[i]);
        }
        putchar('\n');
        }

        if(n3){for(i=0;i<16;i++)
        {
            if(line[i]=='\n')
            {printf("%-5d",'\n');continue;}
	    if(line[i]=='\t')
            {printf("%-5d",'\t');continue;}
            printf("%-5d",line[i]);
        }
        putchar('\n');
        }
        if(n4){for(i=0;i<16;i++)
        {
            if(line[i]=='\n')
            {printf("%-5o",'\n');continue;}
	    if(line[i]=='\t')
            {printf("%-5o",'\t');continue;}
            printf("%-5o",line[i]);
        }
        putchar('\n');
        }
        printf("下一行!\n");
	}
	j++;

    }
}

使用makefile 来进行调用myod函数,并将定义的file传入

file的定义如下:

myfile
main5208:myod.a main.o
	gcc -static -o main5208 main.o ./myod.a
myod.a : myod.o head.h
	ar rcs myod.a myod.o
myod.o : myod.c
	gcc -c myod.c
	
myfile1
main52080:myod.so
	gcc -o main52080 main.c ./myod.so
myod.so:myod.c
	gcc -shared -fpic -o myod.so myod.c

完成用myod XXX实现Linux下od -tx -tc XXX的功能和制作静态库和动态库。

运行成功截图如下:

进行实验中遇到的问题

问题: 尝试编写makefile的时候,出现错误,无法进行make指令。

问题解决: 经过在网上查找,发现了编写makefile时的这一条规则:

-Makefile的规则:

|taeget...:prerequisites...
|    commamd
|    ...
|    ...

注意上面的格式"|"表示是行首,command距离行首是一个table键。

问题: 在进行中还遇到了一个问题,说出来可能会有一点可笑,不过还是想正视自己,因为在上传代码到码云的时候,我发现无法使用git push指令,怎么都上传不上去。

问题解决: 我发现是我自己没有在与码云所连接的那个仓库,也就是指定的文件夹进行上传,才导致是一个空的仓库,经过移动后成功上传。

代码上传截图:

码云链接