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

多层动态库的嵌套实现

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 
#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-动态库嵌套编译生成)