myod

Linux od命令详解:

1.功能

od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。od命令系统默认的显示方式是八进制,名称源于Octal Dump。常见的文件为文本文件和二进制文件。od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出,不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。

2.命令格式

od [<选项><参数>] [<文件名>]

3.命令选项

1. A<RADIX>,--address-radix=RADIX:选择以何种基数表示地址偏移;
2. -j<BYTES>,--skip-bytes=BYTES:跳过指定数目的字节;
3. -N,--read-bytes=BYTES:输出指定字节数;
-S<BYTES>, --strings[=BYTES]:输出长度不小于指定字节数的字符串;
4. -v,--output-duplicates:输出时不省略重复的数据; 
5. -w<BYTES>,--width=<BYTES>:设置每行显示的字节数,od默认每行显示16字节。如果选项--width不跟数字,默认显示32字节;
6. -t<TYPE>,--format=TYPE:指定输出格式,格式包括a、c、d、f、o、u和x,各含义如下:
 a:具名字符;
 c:ASCII字符或者反斜杠;
 d[SIZE]:十进制,正负数都包含,SIZE字节组成一个十进制整数;
 f[SIZE]:浮点,SIZE字节组成一个浮点数;
 o[SIZE]:八进制,SIZE字节组成一个八进制数;
 u[SIZE]:无符号十进制,只包含正数,SIZE字节组成一个无符号十进制整数;
 x[SIZE]:十六进制,SIZE字节为单位以十六进制输出,即输出时一列包含SIZE字节。
--help:在线帮助; 
--version:显示版本信息

4.代码部分

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:
");

  while(ch!=EOF)
  {
     if(ch=='
')
        printf("
");
     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:
");
  fp=fopen(name,"r");
  ch=fgetc(fp);
  while(ch!=EOF)
  {
    if(ch=='
')
    printf("
");
    else
    printf("%4x",ch);
    ch=fgetc(fp);
   }
   fclose(fp);
}

myod.c

#include "head.h"
#include <stdio.h>
void main()
{ 
  char name[50];
  printf("请输入文件名字:");
  scanf("%s",name);
  ascii(name);
  hex(name);
}

头文件head.h

#ifndef __HEAD_H__
#define __HEAD_H__
void hex(char *name);
void ascii(char *name);
#endif

makefile

1327tzy:ascii.o hex.o myod.o
        gcc -o 1327tzy ascii.o hex.o myod.o 
ascii.o:ascii.c head.h
        gcc -c ascii.c
hex.o:hex.c head.h
        gcc -c hex.c
myod.o:myod.c head.h
        gcc -c myod.c   
clean:
        rm 1327tzy ascii.o hex.o myod.o

测试文件text.txt

整体实验流程截图

5.静态库与动态库的实现

静态库的实现

ar cr myod.a hex.o ascii.o
gcc -o myod myod.c ./myod.a

动态库的实现

gcc -shared -fpic -o myod.so ascii.c hex.c
gcc -o myod777 myod.c ./myod.so

6.出现的问题

(1)在主函数调用ascii函数以及hex时无法成功,显示问题是"implicit declaration of function 'hex' 'ascii'".
经过网上查询发现存在三种情况第一种是没有把函数所在的c文件生成.o目标文件;第二种是在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明;第三种是其头文件都声明过了,所调用的函数的原型与所传的实参类型不匹配。但是头文件确实都已经进行声明了,最后发现是头文件书写出现了问题,查看笔记发现应当是__HEAD_H__,我前后都少打了两个__。
参考网站:https://blog.csdn.net/yigedaluobo/article/details/104775533
(2)链接一静态库出现了问题,现实问题为"undefined reference to"
上网查询了资料,发现是因为在链接时发现找不到某个函数的实现文件。
参考网站:https://zhuanlan.zhihu.com/p/24551222

原文地址:https://www.cnblogs.com/tzy20191327/p/15321261.html