静态库和动态库的制作
从逻辑功能上看,程序的主体是由一系列函数组成的,所以编写程序的主要工作之一是实现函数。为了有效降低编程的工作量,编程系统会把一些非常基本、常用的函数集中到函数库中实现,如信息的打印函数、文件的打开或者关闭函数、内存空间的申请与释放函数、数学计算函数等。当程序需要使用函数库中某个函数时,就可以直接从库中调用。
函数库中的使用方式分为静态链接和动态链接两种。静态链接是指编译系统在链接阶段把程序的目标文件和所需的函数库文件链接在一起,这样生成的可执行文件就可以在没有函数库的情况下运行。就好比火箭把燃料和氧料装在一起,这样在没有空气的太空中国也可以飞行。动态链接库是指编译系统在链接阶段并不把目标文件和函数库文件链接在一起,而是等到程序在运行过程中需要的时候才会链接到函数库。
静态链接和动态链接的特点:
使用静态链接方式产生的可执行文件体积大,但是运行效率高。
使用动态链接方式产生的可执行文件由于没有库文件,所以体积小,但是运行中由于要动态加载函数库,所以运行效率要低一点。
在具体应用时,如果有多个源文件要调用函数库,那么应该选择动态链接方式。而只有少数源文件需要调用函数库的时候,应该选择静态链接的方式。可以被静态链接的函数库被称为静态库,可以被动态链接的函数库被称为动态库,或者共享库。
在linux系统中,其中/lib目录中的函数库文件主要是给/bin目录下的的系统程序使用的,/usr/bin目录中的函数库文件主要是给/usr目录下的用户程序使用的。
其中,后缀为a的是静态库文件,后缀为la的是用来记录库文件信息的动态库文件,后缀为so的是动态库文件。
制作静态库:
编写hello.c f1.c f2.c(f1.c 和 f2.c 是hello.c中调用的两个子函数)
把f1.c f2.c 汇编处理,变成二进制文件
gcc -c f1.c f2.c
自动生成f1.o f2.o
把二进制文件做成静态库
ar -crv libxx.a f1.o f2.0
静态库命名方法 lib + 库名 + .a
编译hello.c文件
gcc hello.c -o hello -static -L . -l xx
static 表示采用静态编译
-L 表示静态库的路径(后面跟着路径)
-l 表示库的名字(不要加.a后缀了)
制作动态库:
gcc -fPIC -shared f1.c f2.c -o libxxx.so
编译源文件
gcc hello.c -o hello -L . -l xxx
因为上文讲了加载动态库需要去lib目录下去查找,所以要将libxxx.so文件拷贝到/usr/lib目录下再运行
cp libxxx.so /usr/lib