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


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

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

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

  程序清單如下:

  test.c

  int add(int a,int b)

     {

      retrun a+b;

     }

     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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM