静态库
就是目标文件的集合,调用静态库文件就是把静态库中二进制指令拷贝到你的可执行文件中
优点:速度相对比共享库较快,可执行文件运行时不需要依赖静态库
缺点:可执行文件相对较大,当静态库修改后,可执行文件需要重新编译
例如现在有一个hello函数需要封装
1、编写hello.c文件
#include <stdio.h>
void hello(void)
{
printf("hello,world\n");
}
2、编译hello.c文件生成目标文件hello.o
gcc -c hello.c
3、打包目标文件生成静态库
ar -r libhello.a hello.o
4、成功生成目标文件
系统提示 ar: creating libhello.a
5、使用hello.a
5.1、在当前文件下使用
gcc test.c -libhello.a
5.2、在当其他文件下使用
gcc test.c -L./lib -lhello
5.3、如果嫌麻烦,不想写路径。可以直接把自己的静态库添加到系统环境变量中
1、pwd获取当前hello.a的位置 获取到的结果是 /ubuntu/lib 备用
2、vim ~/.bashrc 打开(系统配置,建议修改时在最后且表上注释)
3、export LIBRARY_PATH=$LIBRARY_PATH:/ubuntu/lib
4、source ~/.bashrc 重新编译
5、gcc test.c -lhello 成功~
共享库(ldd ./a.out 查看文件依赖的库)
就是没有入口的可执行文件的集合,调用共享库时就是记录共享库二进制的指针的位置即可。
当执行可执行文件时,共享库就会一并加载到内存中,可执行文件就可以跳转到共享库中运行
静态库和共享库的辅助工具
优点:可执行文件相对较小,当共享库文件修改后,可执行文件不需要重新编译
缺点:运行速度比静态库慢,可执行文件运行时也需要依赖共享库
例如现在有一个hello函数需要封装
1、编写hello.c文件
#include <stdio.h>
void hello(void)
{
printf("hello,world\n");
}
2、编译hello.c文件生成目标文件hello.o
gcc -fpic -c helloc.c
3、打包目标文件生成共享库
gcc -shared -fpic hello.o -o libhello.so
4、使用hello.a
4.1、在当前文件下使用
gcc code.c libhello.so
不会报错 会成功生成a.out
但是你运行a.out会报错
./a.out: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
4.2、我们将hello.so放入到系统配置中
1、vim ~/.bashrc
2、export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/ubuntu/lib
3、source ~/.bashrc
4、这时再运行a.out成功!