美文网首页C/C++
Linux .so库的使用

Linux .so库的使用

作者: 21世纪不靠谱艺术表演家 | 来源:发表于2019-04-30 23:20 被阅读0次

    产生

    新建一个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 <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后输出递增序列,调用成功。

    相关文章

      网友评论

        本文标题:Linux .so库的使用

        本文链接:https://www.haomeiwen.com/subject/xhbbnqtx.html