Linux静态库与动态库
生成静态库
// 默认生成对应的.o文件,注意c文件中不要把main函数包含进来
gcc .c文件 -c //例如:gcc test.c -c
// 将生成的.o文件打包,静态库的名称命名规则:lib + 库的名字 + .a
// 例如:静态库的名称可以为libtest.a、libmytest.a、libhaha.a
ar rcs + 静态库的名称 + 生成的.o文件 // 例如:ar rcs libtest.a test.o
使用静态库
// -L 指定静态库的目录
// -l 指定静态库目录中的哪个静态库,指定库时不能写前缀lib,也不能写后缀名.a
// -I 指定头文件
// -o 自定义生成可执行文件的名字
gcc main.c -I include -L lib -l mylib -o build
静态库的优点
- 运行程序的时候不再需要对应的库
- 运行程序快,因为对应的函数都被打包进了程序
静态库的缺点
- 库被打包进程序中,导致可执行文件的大小变大
- 当库更新之后,要使用该库必须重新编译程序
生成动态库
// 生成与位置无关的.o
// -I 指定头文件
gcc -fPIC -c .c文件 -I 头文件目录 // 例如:gcc -fPIC -c *.c -I include
// 将.o打包成动态库,动态库命名规则:lib + 库文件 +.so
gcc -shared -o libmytest.so .o文件 -I 头文件目录 // 例如:gcc -shared -o libtest.so *.o -I include
共享库使用
// -L 指定静态库的目录
// -l 指定静态库目录中的哪个静态库,指定库时不能写前缀lib,也不能写后缀名.a
// -I 指定头文件
// -o 自定义生成可执行文件的名字
gcc main.c -I include -L lib -l mylib -o build
# 使用了动态库的可执行文件运行时都要链接库,必须告知库的位置
# 方法一:该方法是临时设置,设置LD_LIBRARY_PATH环境变量,程序运行时会查找LD_LIBRARY_PATH环境变量的值,能根据这个值来查找动态库
echo $LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的路径 #例如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/whn/mylib
# 方法二:设置用户目录下的bashrc配置文件,在最后一行加入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的路径 #例如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/whn/mylib
# 方法三:修改动态链接器的配置文件,将动态库的路径写到配置文件中
sudo vi /etc/ld.so.conf
动态库优点
- 执行程序的大小很小
- 动态库更新之后,如果函数接口没有改变,不需要重新编译文件
动态库缺点
- 执行程序时必须链接对应的库
- 加载速度没有静态库快