MyOD实验
一、题目要求
1. 复习c文件处理内容
2. 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
3. main与其他分开,制作静态库和动态库
4. 编写Makefile
二、OD命令简析
常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。在我看来,od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出他们的值。
如果没有指定文件名,或者文件名为“-”,则从标准输入读入数据。
3. 在编写makefile文件时,链接动态库时出现如下报错:
报错原因:默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。其实,对于由普通用户自己编译生成的.so库文件,比较好的做法是将这些.so库文件的路径用export指令加入到~/.bash_profile中的LD_LIBRARY_PATH变量中,LD_LIBRARY_PATH是程序运行需要链接.so库时会去查找的一个目录,~/.bash_profile是登陆或打开shell时会读取的文件,这样,每次用户登录时,都会把这些.so库文件的路径写入LD_LIBRARY_PATH,这样就可以正常地使用这些.so库文件了。
我的解决方案:
四、实验结果
用myod XXX 实现Linux下od -tx -tc XXX 的功能,只需要输入gcc *.c 即可编译成功。
分别生成动态库与静态库,而后用gcc编译,截图如下:
五、代码展示
myod.c
#include "head.h" #include <stdio.h> void main() { char name[50]; printf("please input the txtname:"); scanf("%s",name); ascii(name); hex(name); }
ascii.c
#include "head.h" #include <stdio.h> void ascii(char *name) { FILE *fp; char ch; fp=fopen(name,"r"); ch=fgetc(fp); printf("output the ascii:\n"); while(ch!=EOF) { if(ch=='\n') printf("\n"); else printf("%4d",ch); ch=fgetc(fp); } fclose(fp); }
hex.c
#include "head.h" #include <stdio.h> void hex(char *name) { FILE *fp; char ch; printf("output the hex:\n"); fp=fopen(name,"r"); ch=fgetc(fp); while(ch!=EOF) { if(ch=='\n') printf("\n"); else printf("%4x",ch); ch=fgetc(fp); } fclose(fp); }
head.h
void hex(char *name); void ascii(char *name);
makefile
testod:myod.c libmyod.so gcc ./myod.c -L./ -lmyod -o ./testod libmyod.so:ascii.o hex.o myod.o gcc -fPIC -c ./ascii.c hex.c myod.c -o ./*.o ascii.o:ascii.c head.h gcc -I ./head.h -c ascii.c -o ascii.o hex.o:hex.c head.h gcc -I ./head.h -c hex.c -o hex.o myod.o:myod.c head.h gcc -I ./head.h -c myod.c -o myod.o