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
指令,怎么都上传不上去。
问题解决: 我发现是我自己没有在与码云所连接的那个仓库,也就是指定的文件夹进行上传,才导致是一个空的仓库,经过移动后成功上传。