1、函数执行条件:声明+定义(链接函数体使之成为程序一部分),才能使用这个函数
2、概念
静态库:成为可执行文件的一部分(在链接时,编译器将此库链接成程序的一部分)
拷贝一份进来
优点:不会因此库文件的丢失而运行失败 缺点:维护与更新困难。
动态库:需要的时候导入。(当此程序需要某个模块时,系统此时才会将此程序导入到内存,并调用此函数。当此模块不再需要使用时,系统会释放此模块)
优先:更新于维护简单
缺点:当可文件丢失时,可能会造成运行失败
3、使用方法
静态库:将目标文件打包成一个库文件
步骤:
- 编辑源文件 vi fun.c
- 编译成目标文件gcc –c fun.c –o fun.o(目标文件是二进制文件,别人看不懂)
- 打包成静态库: ar -crv libfun.a fun.o(规定名字必须以lib开头 .a后缀)
链接: gcc/g++ main.c(源文件) -L./ -lfun -lm -o main
自定义库 系统库(看情况自行决定)动态库:并不是编译时将动态库链接成可执行文件的一部分,而是运行时需要此动态库时才导入此库文件。
注:如果两个库(动态库与静态库)同时存在(同名),以动态库优先。
方法一:共享- 编写源文件
- 生成可执行的库文件 gcc/g++ -fPIC –shared 源文件 –o lib文件名.so
- 添加当前路径:export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH;./”
或添加到系统库中 运行程序
示例代码
#include<stdio.h>
#include<dlfcn.h>//link with -ldl
void main()
{
char* path="./libfun.so";//函数所在动态库库名
char* fun_name="sort";//函数名
char* error=NULL;//用于反馈错误
//1 打开 库指针 路径 打开方式
void* handle=dlopen(path,RTLD_LAZY);
if(NULL!=(error=dlerror()))//如果存在错误
{
printf("error:%s\n",error);
return;
}
//2 从动态库中找匹配的入口地址(函数名)
void (*pfun)(int*,int);
pfun=dlsym(handle,fun_name);
if(NULL!=(error=dlerror()))//如果存在错误
{
printf("error:%s\n",error);
dlclose(handle);//释放
return;
}
//3 调用
int a[5]={5,4,3,2,1};
pfun(a,5);
int i;
for(i=0;i<5;i++)
printf("%d",a[i]);
//4 关闭
dlclose(handle);
}