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 23

 二、使用静态库文件,生成静态库。库文件以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 22 一样大

三、使用动态库文件:生成动态库文件。库文件一般以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 22 一样大

结合老师的博客,以及教学视频,操作流程如上文,然后就到此结尾了。

 附上参考原文地址:https://www.cnblogs.com/guochaoxxl/p/7141447.html

------------恢复内容结束------------