linux 下 动态库的编写和使用
第一个样例
编写头文件
mylib.h
#include <stdio.h>
编写库文件
mylib.c
void Print();
#include "mylib.h"
void Print()
{
printf("This is in my first dynamic lib call");
}
编写測试代码
main.c
#include "mylib.h"
int main()
{
Print();
}
编写README
gcc -shared -fPIC mylib.c -o libcac.so
gcc -fpic -shared mylib.c -o mylib.so
–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态加载时是通过代码拷贝的方式来满足不同进程的须要,而不能达到真正代码段共享的目的。
–shared:指明编译成动态库。
gcc -o main main.c -L./ mylib.so
gcc -o main test.c -L./ ./mylib.so
第二个样例
编写头文件
#define _GETMAXLEN_H_
int getMaxLen(int *sel,int N);
#endif
编写库文件
#include "getmaxlen.h"int getMaxLen(int *sel,int N)
{
int n1=1,n2=1, i=1;
for(i;i<N;i++)
{
if(sel[i]>sel[i-1])
{
n2 ++;
if(n2 > n1)
{
n1 = n2;
}
}
else
{
n2 = 1;
}
}
return n1;
}
编写測试代码
#include "getmaxlen.h"#include<stdio.h>
int main()
{
int Sel[] = {2,3,6,5,3,2,1,2,3,4,5,6,7,6,5};
int m;
m = getMaxLen(Sel,15);
printf("%d",m);
return 0;
}
动态载入库文件
#include "getmaxlen.h"
#include<stdio.h>
#include<dlfcn.h>
int main()
{
void *handle = NULL;
int (*getMaxLen)(int *sel,int N);
int sel[] = {1,2,5,4,5,8,6,5,9,5,4,5,4,1};
handle = dlopen("./mylib.so",RTLD_LAZY);
if(handle == NULL)
{
printf("dll loading error.\n");
return 0;
}
getMaxLen = (int(*)(int *,int))dlsym(handle,"getMaxLen");
if(dlerror()!=NULL)
{
printf("fun load error.\n");
return 0;
}
printf("%d\n",getMaxLen(sel,15));
}
编写README
gcc -shared -fPIC mylib.c -o libcac.so
gcc -fpic -shared mylib.c -o mylib.so
–fPIC:表示编译为位置独立的代码。不用此选项的话编译后的代码是位置相关的所以动态加载时是通过代码拷贝的方式来满足不同进程的须要,而不能达到真正代码段共享的目的。
–shared:指明编译成动态库。
gcc -o main main.c -L./ mylib.so
gcc -o main test.c -L./ ./mylib.so
gcc -fpic -shared getmaxlen.c -o mylib.so(动态载入库文件使用)