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


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

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

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

  程序清單如下:

  test.c

 1 int add(int a,int b)
 2 {
 3    retrun a+b;
 4 }
 5 
 6 int sub(int a,int b)
 7 {
 8    retrun a-b;
 9 }
10 
11 int mul(int a,int b)
12 {
13    retrun a*b;
14 }
15 
16 int div(int a,int b)
17 {
18    retrun a/b;
19 }

 

  test.h的內容

  

1 #ifndef _TEST_H_
2 #define _TEST_H_
3 extern int add(int a,int b);
4 extern int sub(int a,int b);
5 extern int mul(int a,int b);
6 extern int div(int a,int b);

main.c文件內容

 1 #include<stduo.h>
 2 #include<test.h>
 3 int main()
 4 {
 5   int a,b;
 6   printf("please input a and b\n");
 7   scanf("%d %d",&a,&b);
 8   printf("The add:%d\n",add(a,b));
 9   printf("The sub:%d\n",sub(a,b));
10   printf("The mul:%d\n",mul(a,b));
11   printf("The div:%d\n",div(a,b));
12 }

 

  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