美文网首页
Linux学习:03-动态库嵌套编译生成

Linux学习:03-动态库嵌套编译生成

作者: 放纵的卡尔 | 来源:发表于2020-06-24 00:41 被阅读0次

    多层动态库的嵌套实现

    mul.c 生成->libmul.so库.

    add.c调用mul.c生成libadd.so库.

    main.c调用libadd.so库. 可以使用ldd和nm查看库的链接情况.

    //
    // Created by tinychan on 4/25/20.
    //
    #include "mul.h"
    
    int add(int a,int b){
    
       int result=mul(a,b);
        return a+b+result;
    
    }
    
    
    
    //
    // Created by tinychan on 4/25/20.
    //
    int mul(int a,int b){
        return a*b;
    
    }
    
    
    
    #include <stdio.h>
    #include "add.h"
    int main() {
    
        int sum=add(1,2);
        printf("HelloWorld!,%d\n",sum);
    #ifdef DE_DEBUG
        printf("DET_DEBUG\n");
    #endif
    
        return 0;
    }
    
    

    具体操作流程如下:

     1.gcc -fPIC -c mul.c
     2.gcc -shared -o libmul.so mul.o
     得到libmul.so
     
     3.gcc -fPIC -c add.c -I ./include 
     4. gcc   -shared -o libadd.so  add.o  -I ./include/ -L ./ -lmul -Wl,-rpath  /home/tinychan/Desktop/gccTest3/gccDynamic
    注意:  add.o 不能放在最后的位置, 否则生成的.so错误.
    3和4可以合并成一步: 
    gcc -fPIC -shared add.c -o libadd.so -I ./include/ -L ./ -lmul 
    注意: -fPIC后面不能跟-c 否则错误.
    必须加入-Wl,-rpath 或者配置环境变量,否则找不到动态库的路径.
    
    tinychan@ubuntu:~/Desktop/gccTest3/gccDynamic$ ldd libadd.so
        linux-vdso.so.1 (0x00007ffdfd5ef000)
        libmul.so => /home/tinychan/Desktop/gccTest3/gccDynamic/libmul.so (0x00007feb62a5a000)
    查看动态库使用情况如上.
    
    tinychan@ubuntu:~/Desktop/gccTest3/gccDynamic$ gcc main.c -o app.out -I ./include/ -L ./ -ladd -Wl,-rpath  /home/tinychan/Desktop/gccTest3/gccDynamic
    tinychan@ubuntu:~/Desktop/gccTest3/gccDynamic$ ./app.out 
    HelloWorld!,5
    
    OK,可以正常运行了.
    
    
    
    

    相关文章

      网友评论

          本文标题:Linux学习:03-动态库嵌套编译生成

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