什么是动态库、静态库?
- 静态库(.a):
程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。 - 动态库(.so):
程序在运行的时候才去链接动态库的代码,多个程序共享使用的代码。
动态链接和静态链接的区别
- 静态链接(Static Linking):
在链接阶段,将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件。通常具有内存扩大,但具有可移植性。 - 动态链接(Dynamic Linking):
动态链接所调用的库函数代码并没有拷贝到程序的可执行文件中。它仅仅在可执行文件中加入了调用的函数所在库文件和调用函数在文件中的位置等信息链接进目标程序,仅当应用程序被装入内存开始运行时,才从库中寻找相应函数代码,因此需要相应动态库文件的支持。
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了内存和磁盘空间。
生成静态库
//测试程序
//////////////add.h//////////////////
#pragma once
int add(int x, int y);
//////////////add.c//////////////////
#include "add.h"
int add(int x,int y)
{
return x + y;
}
//////////////sub.h//////////////////
===============================
#pragma once
int sub(int x, int y);
==============sub.c=================
#include "sub.h"
int sub(int x,int y)
{
return x - y;
}
//////////////main.c//////////////////
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main()
{
int a=20;
int b=10;
printf("add:20+10=%d\n",add(a,b));
printf("sub:20-10=%d\n",sub(a,b));
return 0;
}
这样就生成了静态库:
ar是gnu归档工具,rc表示(replace and create)
t:列出静态库中的文件
v:verbose 详细信息
- L:指定库路径
- l:指定库名
程序在链接时,会将库的代码链接到可执行文件,因此,我们删掉库后,程序仍然可以运行。
库的搜索路径为
- 从左到右搜索-L指定的目录
- 由环境变量指定的目录(LIBRARY_PATH)
- 由系统指定的目录 >/usr/lib > /usr/local/lib
生成动态库
l:链接动态库,只要库名即可(去掉lib以及版本号)
L:链接库所在路径
在运行动态库时,必须将.so文件拷贝到系统共享库路径下,一般指/usr/lib
更改路径的发方法一般有两种:
- 更改环境变量
[root@localhost libso]# export LD_LIBRARY_PATH=.
[root@localhost libso]# gcc main.c -L -lmymath
[root@localhost libso]# ./a.out
add(10,20) = 10
sub(100,20) = 80
- ldconfig配置/etc/ld.so.conf.d/,ldconfig更新
[root@localhost libso]# echo `pwd` > /etc/ld.so.conf.d/my.conf
[root@localhost libso]# cat /etc/ld.so.conf.d/my.conf
/bit/Linux/libso
[root@localhost libso]# ./a.out
add(10,20) = 10
sub(100,20) = 80