3月20日作业——建立静态,动态库
一、使用make实现
------------恢复内容开始------------
cpa.c
1 #include "cpa.h"
2
3 void cpa(){
4 int var1;
5 int var2;
6 printf("请输入 var1: ");
7 scanf("%d", &var1);
8 printf("请输入var2: ");
9 scanf("%d", &var2);
10
11 if (var1>var2){
12 printf("%d 比 %d 大\n",var1,var2);
13 }
14 else if (var1<var2){
15 printf("%d 比 %d 小\n", var1,var2);
16 }
17 else {
18 printf("%d 和 %d 一样大\n", var1,var2);
19 }
20
21
22 }
cpa.h
1 #ifndef xx_h
2 #define xx_h
3 #include
4
5 void cpa ( );
6
7
8 #endif
testcpa.c
1 #include "cpa.h"
2
3
4 int main (int argc, char **argv)
5 {
6
7
8 cpa();
9
10 return 0;
11 }
这个是附加的文件Makefile,文件名称为Makefile
1 OBJ=testcpa.o cpa.o //对应的是每一个.c 文件一个.o文件
2 testcpa::$(OBJ) cpa.h
3 gcc -o testcpa $(OBJ)
4
5
6 .PHONY:cleanA clean
7 cleanA:
8 rm testcpa $(OBJ)
9
10 clean:
11 rm $(OBJ)
make之后
1 make
2 gcc -o testcpa testcpa.o cpa.o
查看大小各个文件大小:
1 total 24
2 -rw-r--r-- 1 root root 146 Mar 20 21:24 Makefile
3 -rw-r--r-- 1 root root 346 Mar 20 19:58 cpa.c
4 -rw-r--r-- 1 root root 140 Mar 20 20:05 cpa.h
5 -rw-r--r-- 1 root root 2208 Mar 20 22:07 cpa.o
6 -rwxr-xr-x 1 root root 8456 Mar 20 22:08 testcpa
7 -rw-r--r-- 1 root root 101 Mar 20 20:05 testcpa.c
8 -rw-r--r-- 1 root root 1424 Mar 20 22:07 testcpa.o
从上面可以看到可执行文件testcpa的大小为8456,大概是8K左右。
运行程序结果如下:
1 root@LAPTOP-4NGPH5MK:/home/zhonghui/zuoye# ./testcpa 2 请输入 var1: 2 3 请输入var2: 3 4 2 比 3 小
二、使用静态库文件,生成静态库。库文件以lib为前缀,紧接着是库的名称,扩展名为.a,例如我们这里要创建库名libzh.a的库,使用命令ar,具体如下:
1 ar rcs libzh.a testcpa.o cpa.o
使用静态库,创建库文件的接口文件头文件,本文中是cpa.h文件,使用库文件的文件testcpa.c包含头文件cpa.h文件即可,使用如下命令编译:
1 gcc -o testcpa testcpa.c -static -L. -lzh
其中上边命令的说明:
(1)、gcc -o testcpa:使用gcc编译,-o指定文件名,后边的testcpa就是最终生成的文件名
(2)、-static:指明使用静态库
(3)、-L.:-L指明使用库,后面的.表明库文件在当前目录
(4)、-lzh:表明是库文件的名称,其中-表明是选项,l是lib的简写,后边的zh才是真正的库文件名称,后缀名是不需要的
查看文件的大小:
1 ---------- 1 zhonghui zhonghui 148 Mar 20 22:07 Makefile 2 ---------- 1 zhonghui zhonghui 346 Mar 20 20:59 cpa.c 3 ---------- 1 zhonghui zhonghui 140 Mar 20 20:59 cpa.h 4 -rw-r--r-- 1 root root 2208 Mar 21 08:32 cpa.o 5 -rw-r--r-- 1 root root 3842 Mar 21 08:32 libzh.a 6 -rwxr-xr-x 1 root root 958312 Mar 21 08:35 testcpa 7 ---------- 1 zhonghui zhonghui 101 Mar 20 21:27 testcpa.c 8 -rw-r--r-- 1 root root 1424 Mar 21 08:32 testcpa.o
通过上面的显示可以看出,使用静态库文件的可执行文件的大小为95312字节,也就是936k这无疑是非常大的,所以这也是静态库的一个弊端也就是太大了。
执行可执行文件testcpa,使用命令:
1 ./testcpa 2 请输入 var1: 2 3 请输入var2: 2 4 2 和 2 一样大
三、使用动态库文件:生成动态库文件。库文件一般以lib为前缀,紧接着是库的名称,扩展名为.so,我们这里要创建库名libzh.so的库,具体如下:
1 root@LAPTOP-4NGPH5MK:/home/zhonghui/zuoye# make 2 cc -c -o testcpa.o testcpa.c 3 cc -c -o cpa.o cpa.c 4 gcc -o testcpa testcpa.o cpa.o
以上,先运行make命令,通过makefile文件生成目标文件cpa.o testcoa.o
接着使用以下命令:
1 gcc -shared -fPIC -o libzh.so cpa.o
然后接下来开始编译
1 gcc -o testcpa testcpa.c -L. -lzh
以下是查看各个文件的大小:
1 root@LAPTOP-4NGPH5MK:/home/zhonghui/zuoye# ls -l 2 total 36 3 ---------- 1 zhonghui zhonghui 148 Mar 20 22:07 Makefile 4 ---------- 1 zhonghui zhonghui 346 Mar 20 20:59 cpa.c 5 ---------- 1 zhonghui zhonghui 140 Mar 20 20:59 cpa.h 6 -rw-r--r-- 1 root root 2208 Mar 21 08:59 cpa.o 7 -rw-r--r-- 1 root root 3842 Mar 21 08:32 libzh.a 8 -rwxr-xr-x 1 root root 8016 Mar 21 09:05 libzh.so 9 -rwxr-xr-x 1 root root 8288 Mar 21 09:06 testcpa 10 ---------- 1 zhonghui zhonghui 101 Mar 20 21:27 testcpa.c 11 -rw-r--r-- 1 root root 1424 Mar 21 08:59 testcpa.o
上面可以看出,生成的可执行文件testcpa的大小为8288字节,大小为8.09k,相比于静态库要小的多。
接下来是测试建立的库文件是否能正确的运行起来:
1 root@LAPTOP-4NGPH5MK:/home/zhonghui/zuoye# ./testcpa 2 ./testcpa: error while loading shared libraries: libzh.so: cannot open shared object file: No such file or directory
以上表示出现了问题,无法正常使用,然后使用我们老师的方法:
1 export LD_LIBRARY_PATH=$(pwd)
接下来进行测试可以正常运行:
1 root@LAPTOP-4NGPH5MK:/home/zhonghui/zuoye# export LD_LIBRARY_PATH=$(pwd) 2 root@LAPTOP-4NGPH5MK:/home/zhonghui/zuoye# ./testcpa 3 请输入 var1: 2 4 请输入var2: 2 5 2 和 2 一样大
结合老师的博客,以及教学视频,操作流程如上文,然后就到此结尾了。
附上参考原文地址:https://www.cnblogs.com/guochaoxxl/p/7141447.html
------------恢复内容结束------------