如何使用GCC生成動態庫和靜態庫

  根據連接時期的不一樣,庫又有靜態庫和動態庫之分。靜態庫是在連接階段被連接的,因此生成的可執行文件就不受庫的影響,即便庫被刪除,程序依然能夠成功運行。而動態庫是在程序執行的時候被連接的。程序執行完,庫仍需保留在系統上,以供程序運行時調用。連接靜態庫從某種意義上來講是一種複製粘貼,被連接後庫就直接嵌入可執行程序中了,這樣系統空間有很大的浪費,並且一旦發現系統中有bug,就必須一一把連接該庫的程序找出來,而後從新編譯,十分麻煩。而動態庫恰好彌補了這個缺陷,由於動態庫是在程序運行時被連接的,因此磁盤上只需保留一份副本,一次節約了空間,若是發現bug或者是要升級,只要用新的庫把原來的替換掉就能夠了。靜態庫是否是一無可取了呢?非也。若是代碼在其餘系統上運行,且沒有相應的庫時,解決辦法就是使用靜態庫。並且因爲動態庫是在程序運行的時候被連接,所以動態庫的運行速度比較慢。app

  好了,咱們瞭解了關於動態庫和靜態庫的相關知識,那麼如何使用GCC生成靜態庫和動態庫呢?spa

  咱們參考了《LinuxC程序設計大全》上面的例子,來總結GCC下編譯靜態及其動態連接庫的方法及步驟。設計

  程序清單以下:input

  test.c編譯

  int add(int a,int b)程序設計

     {test

      retrun a+b;變量

     }gcc

     int sub(int a,int b)打包

     {

      retrun a-b;

     }

     int mul(int a,int b)

     {

      retrun a*b;

     }

     int div(int a,int b)

     {

      retrun a/b;

     }

  test.h的內容

  #ifndef _TEST_H_

  #define _TEST_H_

  extern int add(int a,int b);

  extern int sub(int a,int b);

  extern int mul(int a,int b);

  extern int div(int a,int b);

 

  main.c文件內容

  #include<stduo.h>

  #include<test.h>

  int main()

  {

    int a,b;

    printf("please input a and b\n");

    scanf("%d %d",&a,&b);

    printf("The add:%d\n",add(a,b));

    printf("The sub:%d\n",sub(a,b));

    printf("The mul:%d\n",mul(a,b));

    printf("The div:%d\n",div(a,b));

  }

  1.使用gcc生成靜態庫及靜態庫使用方法

  在此例中,test.c用於編譯生成靜態庫libtest.a,test.h爲libtest.a對應的頭文件。

  第一步:生成test.o目標文件,使用gcc -c test.c -o test.o命令。

  第二步:使用ar將test.o打包成libtest.a靜態庫,使用ar rcs -o libtest.a test.o命令

  第三步:生成libtest.a靜態庫後,可使用命令ar t libtest.a查看libtest.a文件中包含哪些文件。

  第四步:編譯main.c,並使用libtest.a靜態庫,連接時-l參數後不加空格指定所須要連接的庫,這裏庫名是libtest.a,可是隻須要給出-ltest便可,ld會以libtest做爲庫的實際名字。完整的命令爲:gcc -o app_static main.c -L. -ltest 或者是gcc -o app_static main.c libtest.a

  第五步:運行app_static

  直接使用命令./app_static

  2.使用gcc生成動態庫及使用動態庫的方法

  第一步:生成test.o目標文件,使用以下命令。在此處須要添加-fPIC參數,該參數用於生成位置無關代碼已工生成動態庫使用,使用命令:gcc -c -o test.o -fPIC test.c

  第二步:使用-shared參數生成動態庫,使用以下命令:gcc -shared -o libmyshare.so test.o,上述兩個命令能夠連在一塊兒,以下所示:gcc -shared -fPIC -o libmyshare.so test.c

  第三步:編譯main.c,使用libmyshare.so動態庫,命令以下gcc -o app_share main.c -L. -lmyshare.使用ldd app_share命令查看app_share使用動態庫,若是libmyshare沒法找到,直接執行app_share就會出現錯誤。解決方法:首先使用export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH將當前目錄加入LD_LIBRARY_PATH變量中。再次運行ldd app_share

  另外一種編譯main.c,並連接libmyshare.so的方式以下(該方式經過./libmyshare.so直接指定使用當前目錄下的libmyshare.so文件),使用命令:gcc -o app_share main.c ./libmyshare.so

相關文章
相關標籤/搜索