为什么要使用库?
- 使用库是为了保护自己的源代码,同时也为别人提供服务。
如何使用库:
- 提供对应的库文件
- 提供与库文件对应的头(.h)文件
静态库与动态库
- 静态库:是指程序在编译连接的时候把库的代码链接到可执行文件中,一般后缀是.a。
- 动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码,一般后缀是.so。
查找c标准静态库:
find /usr/lib -name libc.a
查找c标准动态库:
find /usr/lib -name libc.so*
如何给别人提供一个静态库:首先要自己提供一套方法,然后打包。
就以add函数和sub函数为例,说明如何给别人提供一个静态库:
头文件代码:
<add.h>
#pragma once
#include <stdio.h>
int myadd(int x,int y);
<sub.h>
#pragma once
#include <stdio.h>
int mysub(int x,int y);
.c文件代码:
<add.c>
#include "add.h"
int myadd(int x,int y)
{
return x+y;
}
<sub.c>
#include "sub.h"
int mysub(int x,int y)
{
return x-y;
}
测试文件:
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main()
{
int a=10;
int b=20;
int c=myadd(a,b);
printf("%d\n",c);
int d=mysub(a,b);
printf("%d\n",d);
return 0;
}
使用gcc -c编译生成add.c和sub.c的目标文件add.o和sub.o
将add.o和sub.o一起打包生成静态库
最后将生成的静态库文件和头文件放在测试文件中,就可以使用该静态库了。
在使用时,还要用到一下几个命令:
gcc -I //查找头文件
gcc -L //查找库文件
gcc -lmath//-l是链接哪个库,后面紧跟的是库名
gcc -static//链接的静态库
gcc -ldd //查找可执行程序所链接的库
如何生成动态库?
还是以add和sub为例说明,如何生成动态库:
在代码和测试用例写好之后,使用
shared//表示生成共享库格式
fPIC//产生位置无关码(可以随意加载,与位置无关)
生成动态库:
使用动态库
动态库在使用之前需要设置环境变量:
export LD_LIBRARY_PATH=. //设置环境变量
LD_LIBRARY_PATH是程序查找时的默认搜索路径
这里需要设置环境变量的原因是:
编译器只负责编译,执行代码是操作系统的任务,我们使用命令行写的查找路径只有编译器知道,并没有告诉操作系统,所以此时还需设置一下环境变量,否则系统使用默认的libc.so。
为了验证我们是否成功使用动态库,此时还可以查看一下: