多层动态库的嵌套实现
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,可以正常运行了.
网友评论