天天看點

linux下gcc編譯靜态庫和動态庫

庫檔案源代碼,檔案名稱coutlib.c

 1 #include <stdio.h>

  2 unsigned long count(unsigned int a, unsigned int b)

  3 {

  4         return a+b;

  5 }

程式源代碼,檔案名稱cout.c

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3 int main(int argc,char *argv[])

  4 {

  5    unsigned int x,y;

  6    sscanf(argv[1],"%u",&x);

  7    sscanf(argv[2],"%u",&y);

  8    printf("result is :%u\n",count(x,y));

  9    return 0;

 10 }

編譯靜态庫:

1 生成.o檔案gcc -c countlib.c,産物coutlib.o

2 生成.a庫檔案ar crv countlib.a countlib.o,産物coutlib.a

編譯程式(帶靜态庫coutlib.a編譯)

gcc -o count count.c -L./ countlib.a 

測試

./cout 2 4

結果 8

編譯動态連結庫

1 生成.o檔案gcc -fPIC -c countlib.c,産物countlib.o

2 生成動态庫檔案  gcc -shared countlib.o -o countlib.so,産物countlib.so

動态連結庫顯式調用:在程式代碼中書寫調用

動态連結庫隐式調用:在程式編譯的時候調用

這裡隻說明一下隐式調用

gcc count.c -o count2 -L./ countlib.so

測試

./cout 2 4

結果

錯誤,沒有coutlib.so檔案

可以考慮把countlib.so放到/usr/lib下面,也可以考慮在/etc/ld/so.conf.d中把目前路徑增加。