动态编译和静态编译
makefile:
dynamic: dynamic.c
gcc -g $^ -o $@
static: static.c
gcc -g $^ -static -o $@
dynamic.c和static.c:
#include<stdio.h>
int main(){
printf("hello world\n");
return 0;
}
动态链接库的加载时机
链接(编译)时加载
makefile:
all:libfun.so dynamic_load
#
libfun.so:/tools/fun.c
gcc $^ -g -shared -fPIC -o $@
dynamic_load.so:dynamic_load.c
gcc $^ -g -L. -lfun -o $@
fun.c:
#include"fun.h"
int add(int a,int b){
return a+b;
}
dynamic_load.c:
#include<stdio.h>
#include"tools/fun.h"
int main(){
printf("number = %d\n",add(1,2));
return 0;
}
运行时加载
makefile
run_load:run_load.c
gcc $^ -g -ldl -o $@
run_load.c(需要上面的libfun.so文件)
#include<unistd.h>
#include<stdio.h>
#include<dlfcn.h>
//编译时需要使用 -ldl动态库 libdl.so
int add(int a,int b);
//定义函数指针
typedef int (*PFUN)(int,int);
//运行时动态加载so文件
int main(){
//1、加载so文件
void * handle = dlopen("./libfun.so",RTLD_LAZY);//延时加载
if(handle==NULL){
printf("dlopen error :%s\n",dlerror());
return 0;
}
//2、解析符号,获取so文件中的函数(变量)
PFUN pfun = (PFUN)dlsym(handle,"add");
if(handle==NULL){
printf("dlopen error :%s\n",dlerror());
return 0;
}
//3、使用这个函数(变量)
int number = pfun(10,20);
printf("number = %d\n",number);
//4、卸载so文件
dlclose(handle);
return 0;
}