1 动态库
- 动态库把对一些库函数的链接载入推迟到程序运行的时期。
- 可以实现进程之间的资源共享
- 将一些程序升级变得简单
- 甚至可以真正做到链接载入完全由程序员在程序代码中控制
- 编译时仅记录用到哪个共享库中的哪个符号,不复制共享库中的相关代码
- 优点:程序不包含库中代码,体积比较小,库升级方便,无需重新编译
- 缺点:在运行需要加载共享库
1.1 如何创建动态库
-
编写源文件
vim filename1.c / vim filename2.c
-
分别生成相应的.o文件
gcc -c -fPIC filename1.c -o filename1.o gcc -c -fPIC filename2.c -o filename2.o # 注意:-fPIC要生成的与位置无关的代码,可以在任何位置执行
-
生成动态库(共享库)
动态库的命名方式:lib+库名.so.版本号 ---->用数字来表示版本号
gcc -shared -o libfile.so.1 *.o
-
为共享库文件创建软链接文件
创建链接文件的目的就是为了能够升级库时比较方便
ln -s libfile.so.1 libfile.so
-
编译并链接共享库(同时指明库路径)
gcc main.c -o my_app -L. -lfile
-
运行时需要链接动态库
1.2 案例
main.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
// 功能:将指定的文件的行数以及大小进行显示
// 以只读的方式打开一个文件
FILE *fr = fopen(argv[1],"r");
if(NULL == fr)
{
perror("fail to fopen");
return -1;
}
int line = 0, size = 0;
// 函数1:实现行数的统计
cal_line_func(fr,&line);
// 函数2:实现大小的统计
cal_size_func(fr,&size);
printf("行数:%d行\n大小:%d\n",line,size);
fclose(fr);
return 0;
}
line.c
#include <stdio.h>
#include <string.h>
void cal_line_func(FILE *fr, int *p_line)
{
if(NULL == fr || NULL == p_line)
{
return;
}
char data[20] = {0};
while(1)
{
char *p_flag = fgets(data, sizeof(data),fr);
if(NULL == p_flag)
{
return;
}
if('\n' == data[strlen(data) - 1])
{
(*p_line)++;
}
}
}
size.c
#include <stdio.h>
void cal_size_func(FILE *fr, int *p_size)
{
if(NULL == fr || NULL == p_size)
{
return;
}
fseek(fr, 0, SEEK_END);
*p_size = ftell(fr);
rewind(fr);
return;
}
注意:将第四步生成的软链接文件复制到根目录的lib下,因为动态库会去系统库路径下寻找动态库。
执行命令sudo cp libfile.so /lib
将生成的动态库复制到根目录的lib文件夹下