一、库是什么?
库是一个二进制文件,包含的代码可以被程序调用。
例子: 标准C库、数学库、线程库…
库有源码,可被下载后编译;也可以直接安装二进制包。
1.2 库一般放置的位置?
/lib /usr/lib
Windows环境下和LInux环境下位置不一样。
1.3 静态库特点
- 编译(链接)时需要把静态库相关代码复制到可执行文件中。
- 程序中已包含代码,运行时不再加载静态库。
- 程序运行时无需加载静态库,运行速度更快。
- 占用更多磁盘和内存空间。
- 静态库升级后,程序需要重新编译链接。
1.4 动态库(共享库)特点
- 程序不包含库中代码,尺寸小。
- 多个程序可共享同一个库。
- 程序运行时需要加载库。
- 库使用方便,无需重新编译程序。
- 使用更加广泛。
二、使用步骤(制作静态库并使用)
1.创建hello.c,为制作静态库做准备。
代码如下(示例):
// 文件名: hello.c
// 创建一个hello.c的文件,将其制作为为静态库。
#include <stdio.h>
void hello()
{
printf("hello world-hello family!\n");
}
在终端里编译:
1. gcc -c hello.c --将其编译成-c的链接,不用执行
2. ar -rsv libhello.a hello.o // ar命令 创建libxxx.a 文件
// ar: creating libhello.a -----------》 结果展示
// a - hello.o
// 注释: 没有main函数的.c 文件不能生成可执行文件。
2. 创建test_t.c ,为使用静态库hello做准备。
#include <stdio.h>
// 声明
void hello();
int main(int argc, char const *argv[])
{
// 链接静态库
hello();
return 0;
}
在终端里编译:
1. gcc -o test_t test_t.c -L. -lhello // gcc -o 目标文件 源码.c -L 路径 -lxxx
2. ./ test_t // 运行 -L. 指的是当前路径
// hello world-hello family! ------- > 结果展示
2.创建动态库 bye_t.c
#include <stdio.h>
void bye_t()
{
printf("bye bye\n");
}
3. 创建hello.c ---- 并生成动态库
#include <stdio.h>
void hello()
{
printf("hello world-hello family!\n");
}
1. 编译 hello.c 和 bye_t.c:
gcc -c -fPIC hello.c bye_t.c // -fPIC 一定得加, 指的是生成与位置无关的代码
// 生成了hello.o 和bye_t.o 两个文件
2. 生成动态库
gcc -shared -o libmyhellobye.so bye_t.o hello.o
// 生成了 libmyhellobye.so 动态库
4. 生成动态库的链接–创建文件test.c
#include <stdio.h>
void hello();
void bye_t();
int main(int argc,char **argv[]){
hello();
bye_t();
return 0;
}
// 编译:
gcc -o test test.c -L -lmyhellobye
5. 如何找到共享库并执行
// 1. 方法1:将动态库拷贝到/usr/lib里面
// 2. 方法2:在LD_LIBRARY_PATH环境变量中添加 库所在的路径
export LD_LIBRARY_PATH = ./ // 将路径设置为当前路径
// 再执行就可以
// 将环境变量添加到启动脚本里面
vim ~/.bashrc
export LD_LIBRARY_PATH = ./xxxxxx
sources ~/.bashrc // 在所有环境变量下(窗口)都可以使用
ldd test // 可查看test使用的动态库
总结
本章对于动态库和静态库的使用和创建进行了展示,并且需要注意的是:静态库一般以.o结尾,而动态库一般以.so结尾。库一般存放在./usr/lib中,对于静态库和动态库的使用进行了代码展示,最后ldd 可以查看文件所使用的动态库有哪些。