【Linux】Linux下如何生成及使用动态库与静态库?

静态库与动态库

库这个概念对于我们来说并不陌生,在C语言中,我们使用了很多次库,比如printf。一般使用库其实是在用两个东西:一是对应的库文件,二是与库文件相对应的 .h 头文件。一般在在Linux中,库文件有两大类,分别是动态库(.so)静态库(.a)。(Windows下为动态库(.dll)静态库(.a))

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间.

 

生成及使用静态库 

如果我们要给别人提供我们自己写的库,那么就要提供该库的头文件以及,下面实现一个我们自己的mymath库。

1.下面先来编写我们的 add.h、sub.h、add.c、sub.c文件。

2.然后gcc -c编译生成add.c和sub.c的链接文件add.o和sub.o。将add.o和sub.o一起打包成静态库libmymath.a和头文件一起给用户,用户在使用时只需包含头文件,与自己的链接文件连接在一起就可以了。

3.我们来使用一下,除了在编写时要引入相应的头文件之外,在编译链接时,用相应命令就可以啦~  验证可以正常使用!

 

 

 

生成及使用动态库

1.生成动态库。使用gcc -fPIC -c *.c 把所有的.c文件生成与位置无关码的.o文件

  • shared:表示生成共享库格式
  • fPIC:产生位置无关码(可以随意加载,与位置无关)
  • 库名规则:libxxx.so

2.打包动态库。使用gcc -shared -o libmymath.so *.o 将所有的.o文件打包成动态库

我们可以看到下面成功出现了libmymath.so动态库

3.使用动态库

使用方法和静态库一样,大那是在这之前需要设置好环境变量。

编译器负责编译,操作系统来运行我们的可执行程序,而刚刚我们命令行写了库的查找路径仅仅只是告诉了编译器而已,并没有告诉操作系统,所以此时还需设置一下环境变量,否则系统默认使用libc.so

export LD_LIBRARY_PATH = 路径名   //设置环境变量

最后我们来整理一下库,接下来,别人可以自主选择链接动态库还是静态库了。

猜你喜欢

转载自blog.csdn.net/Miss_Monster/article/details/86498322