linux下的C語言開發(靜態庫/動態庫)


動態鏈接庫不是Linux獨有的特性,在windows下面也存在這樣的特性。一般來說,windows下面的動態連接庫是以*.dll作為結尾的,而linux下面的動態連接庫是以*.so結尾的。和靜態鏈接庫相比,動態連接庫可以共享內存資源,這樣可以減少內存消耗。另外,動態連接是需要經過操作系統加載器的幫助才能被普通執行文件發現的,所以動態連接庫可以減少鏈接的次數。有了這個特點,我們就不難發現為什么很多軟件的補丁其實都是以動態庫發布的。

    那么,在Linux上動態庫是怎么生成的呢?

 

[cpp]  view plain  copy
 
  1. #include "test.h"  
  2.   
  3. int add(int a, int b)  
  4. {  
  5.     return a + b;  
  6. }  
    頭文件格式,

 

 

[cpp]  view plain  copy
 
  1. #ifndef  _TEST_H  
  2. #define  _TEST_H  
  3.   
  4. int add(int a, int b);  
  5. #endif  
    此時如果我們想要生成動態庫,要做的工作其實非常簡單,輸入gcc -shared -fPIC -o libtest.so test.c即可。回車后輸入ls,我們就可以發現當前目錄下面出現了libtest.so文件。
[cpp]  view plain  copy
 
  1. #include <stdio.h>  
  2. #include "test.h"  
  3.   
  4. int main()  
  5. {  
  6.     printf("%d\n", add(2, 3));  
  7.     return 1;  
  8. }  
    在上面的代碼當中,我們發現使用到了add函數,那么此時如何才能生成一個執行文件呢?也很簡單,輸入gcc hello.c -o  hello ./libtest.so。然后輸入./hello,此時可以驗證一下執行文件運行是否正確。在編寫靜態庫的時候,我說過靜態庫是匯編鏈接到執行文件當中的,而動態庫不會。朋友們可以做個小實驗,刪除libtest.so,然后輸入./hello。此時大家可以看看系統有沒有錯誤返回?
    這個時候,有的朋友就會問了,那在windows下面dll應該怎么編寫呢?其實也不難,只要在test.h上面稍作改變即可。其他的步驟和 靜態庫的操作是基本類似的。
[cpp]  view plain  copy
 
  1. #ifndef  _TEST_H  
  2. #define _TEST_H  
  3.   
  4. #ifdef USR_DLL  
  5. #define DLL_API _declspec(dllexport)  
  6. #else  
  7. #define DLL_API _declspec(dllimport)  
  8. #endif  
  9.   
  10. DLL_API int add(int a, int b);  
  11.   
  12. #endif  

今天我們討論的問題是靜態庫。為了顯示windows和Linux創建靜態庫之間的差別,我們首先在windows上面利用Visual C++6.0創建一個靜態庫。源文件的代碼很簡單,

 

[cpp]  view plain  copy
 
  1. #include "test.h"  
  2.   
  3. int add(int a, int b)  
  4. {  
  5.     return a + b;  
  6. }  
    頭文件代碼也不難,

 

 

[cpp]  view plain  copy
 
  1. #ifndef _TEST_H  
  2. #define _TEST_H  
  3.   
  4. int add(int a, int b);  
  5. #endif  

    如果你需要在windows上面創建一個靜態庫,那么你需要進行下面的操作,

(1)打開visual C++ 6.0工具,單擊【File】-> 【New】->【Projects】
(2)選擇【Win32 Static Library】,同時在【Project Name】寫上項目名稱,在【Location】選擇項目保存地址
(3)單擊【Ok】,繼續單擊【Finish】,再單擊【Ok】,這樣一個靜態庫工程就創建好了
(4)重新單擊【File】->【New】->【Files】,選擇【C++ Source Files】,
(5)選中【Add to pproject】,將源文件加入到剛才創建的工程中去,在File中輸入文件名+.c后綴
(6)重復4、5的操作,加入一個文件名+.h頭文件
(7)分別在頭文件和源文件中輸入上面的代碼,單擊F7按鈕,即可在Debug目錄中生成*.lib靜態庫文件

    那么,在linux下面應該怎么運行呢?其實很簡單,兩條命令解決,
(1)首先生成*.o文件,輸入gcc -c test.c -o test.o
(2)利用ar命令生成靜態庫,輸入ar rc libtest.a test.o

    此時如果還有一個hello.c文件使用到了這個靜態庫,比如說 ,
[cpp]  view plain  copy
 
  1. #include <stdio.h>  
  2. #include "test.h"  
  3.   
  4. int main()  
  5. {  
  6.     printf("%d\n", add(2, 3));  
  7.     return 1;  
  8. }  

 

    其實也很簡單,輸入一個簡單的命令就可以生成執行文件了,
(1)首先輸入gcc hello.c -o hello ./libtest.a

(2)輸入./hello,驗證生成的執行文件是否正確

(3)朋友們可以刪除libtest.a文件,重新輸入./hello,驗證執行文件是否可以正常運行


 

 
 


免責聲明!

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



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