Linux .so库的使用
2019-04-30 本文已影响0人
21世纪不靠谱艺术表演家
产生
新建一个sort.c文件,写一个最简单的排序
void InsertSort(int* a,int len)
{
int begin = 1;
int i = 0;
while(begin < len)
{
int key = a[begin];
for(i = begin-1;i>=0;i--)
{
if(a[i]<=key)
{
a[i+1] = key;
break;
}
a[i+1] = a[i];
}
if(i<0)
a[0] = key;
begin++;
}
}
使用gcc -o libsort.so -fPIC -shared sort.c
产生libsort.so库。
调用
.so库有两种调用方法:
- 链接进可执行程序;
- 用dlopen()动态加载。
链接法
新建main.c文件:
#include <stdio.h>
int main()
{
int i = 0;
int test[]={1,3,5,7,2,4,6,8};
InsertSort(test,8);
for(i=0;i<8;i++)
{
printf("%d,",test[i]);
}
printf("\n");
return 0;
}
使用命令gcc -o main main.c -lsort -L.
编译。
- -L. 表示.so库在当前目录下;
- -lsort表示调用libsort.so库
运行之前,要先使用命令export LD_LIBRARY_PATH=$(pwd)
将当前目录设为gcc搜索.so库的路径,否则是找不到.so库的。
运行./main后输出递增序列,调用成功。
dlopen
新建main2.c文件:
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main()
{
int i = 0;
int test[]={1,3,5,7,2,4,6,8};
int (*sort)(int*,int);
void *handle = dlopen("./libsort.so",RTLD_LAZY);
if(!handle)
{
printf("dlopen error\n");
return -1;
}
sort = dlsym(handle,"InsertSort");
sort(test,8);
dlclose(handle);
for(i=0;i<8;i++)
printf("%d,",test[i]);
printf("\n");
return 0;
}
使用命令gcc -o main2 main2.c -ldl
编译。动态加载.so库的话需要-ldl。
运行./main2后输出递增序列,调用成功。