Linux .so库的使用

产生

新建一个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库有两种调用方法:

  1. 链接进可执行程序;
  2. 用dlopen()动态加载。

链接法

新建main.c文件:

#include 
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 
#include 
#include 
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后输出递增序列,调用成功。

你可能感兴趣的:(Linux .so库的使用)