2017-2018-1 20155228 《信息安全系统设计基础》第二周课堂测试与课后作业

2017-2018-1 20155228 《信息安全系统设计基础》第二周课堂测试与课后作业

题目和要求

Makefile

  • 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.
  • 提交Make过程截图,要全屏,包含自己的学号信息

静态库的测试

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

共享库

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

myod

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

分析和设计

Makefile

  • 在命令行中输入以下命令,用vim创建一个名为makefile的文本
vim Makefile
  • 在makefile文本中写下如下代码,保存文本并退出
testmymath/*待生成的文件名*/: 20155228add.c 20155228sub.c 20155228mul.c 20155228div.c head.h/*需处理的文件名*/
    /*这里是TAB不是空格*/gcc *.c head.h -o testmymath/*需执行的命令*/
  • 在命令行中输入以下命令,得到testmymath
make

静态库的测试

  • 在命令行中输入以下命令,将.c文件处理为.o文件
gcc -c 20152228add.c/*待处理的文件名*/ -o add.o/*处理好的文件名*/ 
gcc -c 20152228sub.c/*待处理的文件名*/ -o sub.o/*处理好的文件名*/ 
gcc -c 20152228mul.c/*待处理的文件名*/ -o mul.o/*处理好的文件名*/ 
gcc -c 20152228div.c/*待处理的文件名*/ -o div.o/*处理好的文件名*/ 
  • 在命令行中输入以下命令,生成静态库
ar -cr libmymath.a/*生成的静态库文件名*/ add.o sub.o mul.o div.o/*生成静态库文件所需文件*/
  • 在命令行中输入以下命令,实现20155228main.c对libmymath.a的使用,生成名为main的文件
gcc 20155228main.c head.h libmymath.a -o main

共享库

  • 在命令行中输入以下命令,得到名为mymath.so的动态库文件
gcc -shared -fpic -o mymath.so/*生成的动态库文件名*/ 20155228add.c 20155228sub.c 20155228mul.c 20155228div.c/*生成动态库文件所需文件*/
  • 在命令行中输入以下命令,实现20155228main.c对mymath.so的使用,生成名为mymath的文件
gcc 20155228main.c head.h mymath.so -o mymath
  • 在命令行中输入以下命令,把mymath.so移动到/usr/lib/目录中
sudo mv mymath.so /usr/lib/

myod

  • 在命令行中输入以下命令,用vim创建一个名为MyOd的文本
vim MyOd
  • 在MyOd中写下以下代码
#include <stdio.h>
#include <stdlib.h>
main ()
{
    FILE *fp;//定义指向文件的指针
    char ch;
    int i,count;
    if((fp=fopen/*打开文件*/("/home/besti20155228/20155228代码备份/0930MyOd/hello.c"/*待读文件路径*/,"rb"))==NULL)//如果文件打开失败
    {
        printf("文件打开失败!");
        exit(0);
    }
    count=0;
    while((ch=fgetc(fp))!=EOF)//如果待读文件中还能读到字符
    {
        if(isprint(ch)//如果字符可以打印)
        {
            count++;
            printf("%4c %4x ",ch,ch);//打印字符和字符的ascii码
            if(count%8==0)
                printf("
");
        }

    }
    fclose(fp);/*关闭文件*/
    printf("
");
    return 0;
}

  • 编译运行程序即可

问题和解决

问题

在利用动态库生成mymath后,输入命令运行mymath报错

./mymath

错误信息:

./main: error while loading shared libraries:mymath.so: cannot open shared object file: No such file or directory

解决

将文件myhello.so复制到目录/usr/lib中:

sudo mv mymath.so /usr/lib/

代码和结果

代码链接

参考资料

Linux环境下c语言静态链接库和动态链接库创建和使用

Makefile 使用

原文地址:https://www.cnblogs.com/besti20155228/p/7617023.html