Linux下静态库与动态库的制作与使用

3 篇文章 0 订阅
为了代码的共享和可重用,将一些需要反复使用的代码制作成库文件,有两种类型的库文件:静态库和动态库。
静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。
使用静态库文件,在链接过程中,将库内的代码完整进行拷贝复制到程序中,生成EXE可执行文件,优点是,EXE可以脱离环境执行,(一次编译,处处执行),因为已包含所有的lib代码。缺点是,可扩展性差,当lib功能扩展之后,需要重新编译链接EXE文件。以及多次使用lib就会有多分冗余的拷贝。

················Linux下························

Linux 文件系统中的 库文件 (静态链接库 动态链接库)

1. 静态函数库

    这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

2. 动态函数库

    这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。 
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

共同点:

都为了 代码的共用性 复用性

将共用的功能模块 提前写好  需要时 链接就可以用了

区别:

      静态库是在链接阶段使用,会将库文件的内容添加合成到最终的 可执行文件中,

      动态库是在运行阶段使用


静态链接库 (目标代码(.o文件)的集合)     编译阶段——》可执行文件直接包含了库
动态链接库(共享库)                                     运行阶段——》(可)执行文件(二进制文件)

静态库的制作:
gcc  -c  *.c  --> *.o
ar  crv  libname.a   *.o  -->libname.a 
静态库


静态库的使用:
gcc -o main main.o  -L.(
指定搜索静态库的路径)  -l(指定库的名称)name

例子:

编辑三个c文件:

hadoop@hadoop-virtual-machine:~/桌面/ku$ cat pr1.c
#include <stdio.h>

void print1()
{
		printf("`````````````1`````````\n");
}


hadoop@hadoop-virtual-machine:~/桌面/ku$ cat pr2.c
#include<stdio.h>

void print2()
{
		printf("`````````````````````2`````````\n");
}

hadoop@hadoop-virtual-machine:~/桌面/ku$ cat main.c
#include <stdio.h>

void main()
{
		printf("````````````main````\n");
		print1();
		print2();
}

hadoop@hadoop-virtual-machine:~/桌面/ku$ 

将 pr1.c 和pr2.c制作成静态库:
hadoop@hadoop-virtual-machine:~/桌面/ku$ ls
pr1.c  pr2.c
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -c pr1.c pr2.c
hadoop@hadoop-virtual-machine:~/桌面/ku$ ls
pr1.c  pr1.o  pr2.c  pr2.o
hadoop@hadoop-virtual-machine:~/桌面/ku$ ar crv libpr.a pr1.o pr2.o
a - pr1.o
a - pr2.o
hadoop@hadoop-virtual-machine:~/桌面/ku$ ls
libpr.a  pr1.c  pr1.o  pr2.c  pr2.o
在main.c中链接静态库 调用两个函数:
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -o main main.c -L./ -lpr
hadoop@hadoop-virtual-machine:~/桌面/ku$ ls
libpr.a  main  main.c  pr1.c  pr1.o  pr2.c  pr2.o
hadoop@hadoop-virtual-machine:~/桌面/ku$ ./main
````````````main````
`````````````1`````````
`````````````````````2`````````




共享库(动态库):
gcc  -g -shared   -fPIC  -o   libname.so   *.c  --> libname.so 


(
共享库)
共享库的使用:
gcc -o main main.o  -L  -lname
将共享库拷贝到默认搜索路径下
修改LD_LIBRARY_PATH环境变量

 

例子:


制作动态库:
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -O -fpic -shared -o dl.so pr3.c
或者
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -g -shared -fPIC -o libp.so pr3.c
使用动态库:
hadoop@hadoop-virtual-machine:~/桌面/ku$ gcc -o main main.c ./dl.so
hadoop@hadoop-virtual-machine:~/桌面/ku$ ./main
````````````main````
`````````````3`````````



头文件 在Linux中的/usr/include

终端中可以执行的命令 以及可执行程序  /bin (系统的一些命令)  或者/usr/bin (其他后来的程序的命令)

库文件 :静态库 共享库(Windows中叫做 .dll) 在系统中的/lib  /lib

 库: 已经编译好的方法的集合打包成一个文件 供其他程序使用

 静态库:lib***.a  (静态库文件有固定的前缀和后缀)

预编译main程序时将需要用到的库文件 全部包含在main中,#include<stdio.h>

             将所有stdio.h里的函数 都复制到main主程序中

             当运行时,内存中有重复代码,内存占用空间大 ,如果库文件做了改变,需要重新编译链接 才能运行。

共享库: lib***.so 

             要用到库文件中的方法,不需要全部包含进来,而是在程序运行时,再去库文件中找到方法,再加载到内存中 运行。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值