有兩個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
使用之前要提前設定環境變量;