有两个so,其中soB中调用soA;
那么我们打包soB的时候连接soA;
在打包test程序的时候连接soB,此时soB会自动查找依赖的soA;
如下测试
在编译之前指定环境变量:export LD_LIBRARY_PATH=./
soA
#include <stdio.h>
int add(int a,int b){
return (a+b);
}
编译成so
gcc -shared -fPIC -o libadd.so add.c
soB
#include <stdio.h>
extern int add(int a,int b);
int cal(int a,int b){
return (add(a,b)+1);
}
编译成so,编译时连接soA,就是 -ladd
gcc -shared -fPIC -o libcal.so cal.c -L. -ladd
测试程序test.c
#include <stdio.h>
extern int cal(int a,int b);
int main(void)
{
printf("%d\n",cal(11,10));
return 0;
}
编译测试程序,这里我们只是连接了cal,没连接add
gcc test.c -o test -L. -lcal
最后运行test
由于我们前面指定的环境变量,可以这么做,如果不指定环境变量,默认会从系统的库路径下查找,那么找不到so,就无法编译我们的测试程序;
完整的Makefile
all:
gcc -shared -fPIC -o libadd.so add.c
gcc -shared -fPIC -o libcal.so cal.c -L. -ladd
gcc test.c -o test -L. -lcal
clean:
rm -rf test
rm -rf *.so
使用之前要提前设置环境变量;