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
码云链接