MyOD实验

       一、题目要求

       1. 复习c文件处理内容

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

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

       4. 编写Makefile

       二、OD命令简析

       常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。在我看来,od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出他们的值。

        如果没有指定文件名,或者文件名为“-”,则从标准输入读入数据。

        od 命令用指定格式显示由 File 参数指定的文件。如果 File 参数没有给定, od 命令读取标准输入。 使用多个 -bcCDdFfOoSstvXx 选项可以指定多个类型。
        在第一个语法格式中,输出格式是由 -t 标志指定。如果没有指定格式类型,-t o2 是缺省值。
        在第二个语法格式中,输出格式由标志组合指定。Offset 参数指定了文件中文件输出的开始点。 缺省情况下,Offset 参数解释为八进制字节。如果附加了 . 点后缀, 参数解释为十进制的;如果参数前导以 x 或 0x 开始,处理为十六进制。如果 b 后缀添加到参数,解释为块是 512 字节;如果 B 后缀添加到参数上,解释为块是 1024 字节。
        三、在实验过程中遇到的问题
       1. 对于gedit的功能不够了解
                  gedit是一个文本编辑器,其特点是在GNOME桌面环境下兼容“UTF-8”。可以将其当成是一个集成开发环境,打开修改需要root权限。
       2. 由于粗心输错待读取文本文件的名字,将“text.txt”误输入成“test.txt”而引发“段错误”报错。
                 

       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

 

 

 

 

 

posted on 2020-10-11 20:34  Judy_Zhu  阅读(122)  评论(0编辑  收藏  举报