第一个例子
编写头文件
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(动态加载库文件使用)