目录
1. 静态库与动态库的说明
- 静态库,libxxx.a,在编译时就将库编译进可执行程序中。
- 优点:程序的运行环境中不需要外部的函数库。
- 缺点:可执行程序大。
- 动态库,又称共享库,libxxx.so,在运行时将库加载到可执行程序中。
- 优点:可执行程序小。
- 缺点:程序的运行环境中必须提供相应的库。
- 函数库目录:/lib /usr/lib。
以下以 main.c 和 sub.c 为例子生成静态库和动态库并使用。
main.c
#include <stdio.h>
int main()
{
int x, y;
int ret;
x = 10;
y = 5;
ret = sub(x, y);
printf("ret = %d\n", ret);
return 0;
}
sub.c
int sub(int x, int y)
{
return (x - y);
}
2. 静态库:
2.1 静态库的制作:格式 xxx.a
- gcc sub.c -c 生成 sub.o文件
- ar rcs libsubStatic.a sub.o 生成 sub.a 静态库文件 // sub 前要加 lib 后缀要改 .a
2.2 静态库的编译:
gcc main.c -lsubStatic -L ./ -o mainProStatic
- -l 是指定要用的静态库,库名砍头去尾
- -L 是告诉 gcc 编译器从 -L 指定的路径去找静态库,默认是从 /usr/local/lib 去找
2.2 静态库的使用:
因为在编译时就将库编译进可执行程序中,所以可以直接 ./mainProStatic 运行
3. 动态库:
3.1 动态库的制作: 格式 xxx.so
gcc -shared -fpic sub.c -o libsubDy.so
- -shared 是指定生成动态库
- -fpic 标准,fpic 选项作用于编译阶段,在生成目标文件时就得使用该选项以生成位置无关的代码
3.2 动态库的编译
gcc main.c -lsubDy -L ./ -o mainProDy
3.3 动态库的使用:
动态库的使用不能直接 ./mainProDy ,因为动态库使用的时候会去找动态库文件,默认也是去 /usr/local/lib 去找,所以使用的时候需要做一定的处理。
- 方法一(风险):直接把动态库文件 libsubDy.so 放到 /usr/local/lib 中去。
- 方法二(当前终端有效):先在动态库位置打出 pwd 获取当前路径,例如我的是/home/outside/08_LIB 。 然后配置环境变量 export LD_LIBRARY_PATH=/home/outside/08_LIB 配置完后即可使用程序。
- 方法三(所有终端有效):在 /etc/ld.so.conf 文件里加入我们生成的库的目录,然后 sudo ldconfig /etc/ld.so.conf 因为不是在 home 目录下 所以操作都要加 sudo 。 /etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,可以把我们库的目录加入到这个文件中。然后即可直接顺利运行。