天天看點

gcc 編譯兩個so其中soA依賴soB

有兩個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        

使用之前要提前設定環境變量;