美文网首页
生成以及链接动态库

生成以及链接动态库

作者: 凌烟醉卧 | 来源:发表于2019-09-30 22:50 被阅读0次

    这篇文章讲解了如何生成动态库,以及如何与动态库链接。

    了解如何生成以及链接动态库,需要对gcc/g++有所了解,这里提供一些资料
    交叉编译必知--gcc/g++详细讲解

    在演示之前,准备3个文件,分别为ctest1.c,ctest2.c和prog.c。

    ctest1.c文件

    void ctest1(int *i)
    {
       *i=5;
    }
    

    ctest2.c文件

    void ctest2(int *i)
    {
       *i=100;
    }
    

    prog.c文件

    #include <stdio.h>
    void ctest1(int *);
    void ctest2(int *);
    
    int main()
    {
       int x;
       ctest1(&x);
       printf("Valx=%d\n",x);
    
       return 0;
    }
    

    我们的目的是将ctest1.c和ctest2.c文件打包成.so库,然后让prog这个文件链接到.so这个库。

    生成动态库有两种方式
    gcc test1.cpp test2.cpp -fPIC -shared -o libtest.so
    也可以根据.o文件来生成
    gcc -shared -fPIC -o libtest.so test1.o test2.o
    使用时:
    gcc -o main main.cpp -L. -ltest
    -L. 代表当前目录下

    1.编译库函数

    gcc -Wall -fPIC -c ctest1.c ctest2.c
    

    2.生成共享库

    gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 ctest1.o ctest2.o 
    

    移至lib /目录

    sudo mv libctest.so.1.0 /opt/lib
    sudo ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1
    sudo ln -sf /opt/lib/libctest.so.1 /opt/lib/libctest.so
    

    注意:如果opt下面没有lib这个文件夹,需要先创建,否则mv会重命名。

    3.编译要与共享库一起使用的程序

    gcc -Wall -L/opt/lib prog.c -lctest -o prog 
    

    注意:如果未设置库路径,则会出现以下错误:./prog:加载共享库时出错:libctest.so.1:无法打开共享库文件:没有这样的文件或目录

    设置库路径

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib  //设置库路径
    

    在动态库的使用时,由于其特殊性,编译器会到指定的目录去寻找动态库,所以你需要告诉编译器你库存放的路径,否则编译会报找不到库的错误,原因在于系统默认加载的动态链接库路径里没有找到你的动态库,Id链接器优先在该变量设置的路径中查找,若未找到则在标准库路径/lib和/usr/lib中继续搜索。

    注:LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库,动态链接时除了默认路径之外的其他路径。

    相关文章

      网友评论

          本文标题:生成以及链接动态库

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