玛卡巴卡·呣  

       当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将他们生成库,使得以后编程可以减少开发代码量。以下整理了Linux下静态库和动态库的运用和体会。

(一)没有库文件的处理

以一个简单的程序——找出两个整数中的较小者,为例。

lesser.c

 imin.h

 测试文件testLesser.c

  以下是附加的文件makefile,文件名称为Makefile(字母大写是为了在home目录下更好的查找)

 使用make生成可执行文件,并有下面的提示信息。

         巧妙运用makefile的优点——“自己主动化编译”。一旦写好,仅仅需要一个make命令,整个工程全然自己主动编译,极大提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的指令工具。且如果其中的文件文件要更改,可以使用同一个命令make即可重新编译生成新的执行文件,make会自动判断哪些文件需要重新编译(根据.o文件和.c文件生成时间的比较)。

查看文件大小:

 以上很明显可以看出形成的可执行文件大小为8512字节。

执行可执行文件,使用命令: 

 

 (二)静态库的建立

 

        静态库的建立简单来说是将.o文件放在一起,防止源码泄露,可大幅度提高代码的安全性。因可执行文件已完全链接好,所以不依赖系统环境,其代码可复制或移动到任何文件夹或目录下运行。利用静态函数库编译的可执行文件比较大(如以上可执行文件字节为958384),因为整个函数库的所有数据都会被整合进目标代码中,即编译后的执行程序不需要外部的函数库的支持,因为所有使用的函数都已经编译进去了。但是这也会成为它的缺点,因为如果静态函数库改变了,那么程序必须重新编译。

静态库建立的以下步骤:

1.利用命令 “ar  rcs libzk.a lesser.o"生成静态库。

库文件一般以lib为前缀,紧接着是库的名称,拓展名为.a,lib[name].a  如此处创建的库名libzk.a的库。使用ar命令仿照以上格式书写,库名后加上make命令后重复编译的所有设计的库源码.o文件,注意不要遗漏。

2.建立一个lib目录,此处建立的是libzk目录。

3.利用命令 ”cp testLesser.c imin.h libzk.a libzk/" 将我们的测试文件和头文件以及生成的静态库复制到libzk目录下。

4.进入libzk目录,利用命令 “gcc -o testLesser testLesser.c -stastic -L. -lzk"使用静态库。创建库文件的接口文件头文件。

其上命令说明如下:

gcc -o testLesser  使用gcc编译,-o指定文件名,其后的testLesser就是最终生成的文件名

-stastic  指明使用静态库

-L.  指明使用库,后面的.表明库文件在当前目录

-lzk  表明是库的名称,其中-表明是选项,l是lib的简写,后面的zk才是真正的库文件名称,后缀名不需要

 

静态库的使用提高了代码的安全性,当他人进入到库文件libzk.a查看时只能看到乱码如下:

 

 (三)动态库的建立

       动态函数库和静态函数库有明显不同,相对于静态函数库,动态函数库在编译的时候,并没有被编译进目标代码中。程序执行到相关函数时,才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小(如以上可执行文件大小字节为8480)。由于函数库没有被整合进程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库,非常依赖运行环境。动态函数库的改变并不影响程序,所以动态函数库的升级比较方便。

动态库建立的以下步骤:

1.建立一个lib目录,此处建立的是libSo目录。

2.利用命令" cp *.o libSo/ " ” cp testLesser.c imin.h libSo/ " 将我们的所有中间目标.o文件和测试文件及头文件复制到建立的libSo目录下。

3.进入libSo目录,利用命令“ gcc -shared -fPIC -o libzk.so "生成动态库。

库文件一般以lib为前缀,紧接着是库的名称,拓展名为.so  lib[name].so 如此处创建的库名libzk.so的库。

其上命令说明如下:

gcc -o libzk.so  使用gcc编译,-o指定文件名,后面的libzk.so就是最终生成的动态库名

-shared  指明生成动态库

-fPIC  该选项告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用,运行时进行地址链接

4.利用命令“ gcc -o testLesser testLesser.c -L. -lzk "生成可执行文件。

同静态库,但有一个不同的是没有-static ,其正是说明了生成的是动态库,而不是静态库

 

posted on 2020-03-22 13:53  玛卡巴卡·呣  阅读(135)  评论(0)    收藏  举报