文章目录
一、库文件的定义
库:本质是一个二进制文件,在这个二进制文件中不能有main函数。
库文件客户保护用户代码的实现,然而也不影响其他用户的使用。库分为动态库和静态库。
通俗来讲就是将用户写好的程序打包成一个整体,当其他模块或用户使用时,只需要有这个库文件就可以了,不需要源代码文件。
常见的库的格式如下:
windows:
动态库:xxxx.dll
静态库:xxxx.lib
linux:
动态库:libxxx.so (xxx:库名)
静态库:libxxx.a (xxx:库名)
二、静态库
2.1 静态库的特点
静态库:静态库的格式是libxxx.a
格式的,它是一个二进制文件。
如果用户想使用这个库文件需要将这个库文件和自己的.c文件编译生成一个可执行文件(将库中的函数放在可执行程序中)。
使用静态库生成的可执行文件体积比较大,运行的时候不在需要这个库文件libxxx.a
,效率比较高。但使用静态库生成的可执行程序更新库比较麻烦。
2.2 静态库的制作
add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif
add.c
int add(int a,int b)
{
return (a+b);
}
main.c
#include <stdio.h>
#include <add.h>
int main(int argc, const char *argv[])
{
int a = 100, b = 200;
printf("%d\n", add(a, b));
return 0;
}
执行命令gcc -c add.c -o add.o
只编译不链接生成add.o
文件
执行命令ar -cr libadd.a add.o
生成libadd.a
文件
ar
制作静态库的命令
-c
创建静态库
-r
将函数放到库文件中
2.3 静态库的使用
-L
:指定库的路径
-l
:链接使用的库
-I
:指定头文件的路径
执行命令gcc main.c -L 库的路径 -l库名 -I 头文件路径
生成a.out
文件
三、动态库
3.1 动态库的特点
动态库:动态库的格式是libxxx.so
格式的,它是一个二进制文件。
如果用户想使用这个库文件需要将这个库文件和自己的.c文件编译生成一个可执行文件(将库中的函数符号表放在可执行程序中)。
使用动态库生成的可执行文件体积比较小,可以被多个程序共享,所以又叫共享库。运行的时候需要这个库文件libxxx.so
,效率比较低。但使用动态库生成的可执行程序更新简单。
3.2 动态库的制作
继续使用上面的程序为例:
执行命令:
gcc -fPIC -shared add.c -o ../lib/libadd.so
制作动态库的命令
-fPIC
:忽略文件位置
-shared
:标识生成动态库
3.3 动态库的使用
3.3.1 编译可执行程序依赖动态库
-L
:指定库的路径
-l
:链接使用的库
-I
:指定头文件的路径
执行命令:gcc main.c -L ../lib -ladd -I ../inc
生成a.out
文件
3.3.2 执行可执行程序(指定库的路径)
方式1:将自己的库放在/lib
sudo mv libadd.so /lib
./a.out
方式2:通过命令指定库的路径 (只在当前终端生效)
export LD_LIBRARY_PATH=../lib/
./a.out
方式3:通过修改库的配置文件让其生效
sudo vi /etc/ld.so.conf.d/libc.conf
ldconfig
通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。