2017-2018-1 20155332第2周课堂实践

2017-2018-1 20155332 第2周课堂实践

第5题

题目

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

解法

  • [参考资料]
    英文版:http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
    不太完整的翻译:http://blog.csdn.net/benben85/article/details/4161130

  • [简介]
    共享库(Shared Library)是Linux下的通用函数库,与Windows的dll非常类似
    但是通过良好的机制,尽量避免了dll的版本升级问题(dll hell)
    一般在Linux下,共享库使用so(Shared Object)作为扩展名,后面还会跟上版本号

  • [共享库的生成和使用]
    假设有test.h test.cpp用于生成一个共享库,还有一个main.cpp来使用这个库
    ----------------------Shell------------------------
    $ gcc -c test.cpp -o test.o
    $ gcc -shared -fPIC -Wl,-soname,libtest.so.1 -o libtest.so.1.0 test.o
    $ ln -s libtest.so.1.0 libtest.so.1
    $ ln -s libtest.so.1 libtest.so
    $ gcc main.cpp -L. -ltest -o test
    $ LD_LIBRARY_PATH=$(pwd) ./test
    -------------------------------------------

  • [解决过程]

gcc -shared -fpic -o libcal.so sub.c add.c mul.c div.c
gcc -o math5332 main.c ./libcal.so

--------

myod

题目

  • 复习c文件处理内容
    编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
    main与其他分开,制作静态库和动态库
  • 我的代码
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
int main()
{
	FILE *fp;
	fp=fopen ("b","r+");
	char ch;
        char st[1000];
	int i=1,j=1,n=0;
        while ( (ch=fgetc(fp))!=EOF){
		//if(ch!='
')st[i]=ch;
		//else st[i]='\n';
		st[i]=ch;
		i++;
	}
	n=i;
        for(i=1;i<=n;i++)
	{
		if(st[i]=='
')printf("  \n");
		else printf("%3c",st[i]);
		if(i%16==0){
			printf("
");
			for(;j<=i;j++)printf("%3x",st[j]);
			printf("
");
			}
	}
        for(;j<=i-2;j++)printf("%-3x",st[j]);
        printf("
");
	fclose(fp);
	return 0;
}
  • makefile文件

myod: myod.c
gcc -o myod myod.c
码云链接

原文地址:https://www.cnblogs.com/besti2015/p/7617770.html