静态库建立
ar rcs libadd.a add.c
静态库使用
gcc -o test test.c -L/ -ladd 或者 gcc -o test test.c ./libadd.a
动态库建立
gcc -fpic -shared -o libaddfunc.so addfunc.c
动态库静态调用:
1、将动态库置入库加载环境变量中:
export LD_LIBRARY_PATH=/home/oracle/lib:$LD_LIBRARY_PATH
2、使用ld-linux.so.2来加载库
ld-linux.so.2 --library-path SO路径 执行程序名
如:ld-linux.so.2 --library-path /home/oracle/c /home/oracle/so/testaddfunc
动态库动态调用:
1、打开动态链接库 dlopen
void* dlopen(const char* filename, int flag)
如void* phandle = dlopen("./libaddfunc.so", RTLD_LAZY);
2、获得函数指针 dlsym
void* dlsym(void* handle, void* symbol);
pAddfun = dlsym(phandle, "add");
例子:
#include <stdio.h>
#include <dlfcn.h>
int main()
{
int (*addfunc)(int, int);
void *phandle = NULL;
char *perr = NULL;
phandle = dlopen("/home/oracle/so/libaddfunc.so", RTLD_LAZY);
if (!phandle)
{
printf("fail to load so\n");
}
perr = dlerror();
if (perr != NULL)
{
printf("%s\n", perr);
return 0;
}
addfunc = dlsym(phandle, "add");
perr = dlerror();
if (perr != NULL)
{
printf("%s\n", perr);
return 0;
}
int result = 0;
result = addfunc(10, 20);
printf("add result = %d\n", result);
dlclose(phandle);
return 0;
}