動態鏈結庫不是linux獨有的特性,在windows下面也存在這樣的特性。一般來說,windows下面的動態連線庫是以*.dll作為結尾的,而linux下面的動態連線庫是以*.so結尾的。和靜態鏈結庫相比,動態連線庫可以共享記憶體資源,這樣可以減少記憶體消耗。另外,動態連線是需要經過作業系統載入器的幫助才能被普通執行檔案發現的,所以動態連線庫可以減少鏈結的次數。有了這個特點,我們就不難發現為什麼很多軟體的補丁其實都是以動態庫發布的。
那麼,在linux上動態庫是怎麼生成的呢?
[cpp]view plain
copy
#include "test.h"
int add(int a, int b)
頭檔案格式,
[cpp]view plain
copy
#ifndef _test_h
#define _test_h
int add(int a, int b);
#endif
此時如果我們想要生成動態庫,要做的工作其實非常簡單,輸入gcc -shared -fpic -o libtest.so test.c即可。回車後輸入ls,我們就可以發現當前目錄下面出現了libtest.so檔案。
[cpp]view plain
copy
#include
#include "test.h"
int main()
在上面的**當中,我們發現使用到了add函式,那麼此時如何才能生成乙個執行檔案呢?也很簡單,輸入gcc hello.c -o hello ./libtest.so。然後輸入./hello,此時可以驗證一下執行檔案執行是否正確。在編寫靜態庫的時候,我說過靜態庫是彙編鏈結到執行檔案當中的,而動態庫不會。朋友們可以做個小實驗,刪除libtest.so,然後輸入./hello。此時大家可以看看系統有沒有錯誤返回?
這個時候,有的朋友就會問了,那在windows下面dll應該怎麼編寫呢?其實也不難,只要在test.h上面稍作改變即可。其他的步驟和
靜態庫的操作是基本類似的。
[cpp]view plain
copy
#ifndef _test_h
#define _test_h
#ifdef usr_dll
#define dll_api _declspec(dllexport)
#else
#define dll_api _declspec(dllimport)
#endif
dll_api int add(int a, int b);
#endif
今天我們討論的問題是靜態庫。為了顯示windows和linux建立靜態庫之間的差別,我們首先在windows上面利用visual c++6.0建立乙個靜態庫。原始檔的**很簡單,
[cpp]view plain
copy
#include "test.h"
int add(int a, int b)
標頭檔案**也不難,
[cpp]view plain
copy
#ifndef _test_h
#define _test_h
int add(int a, int b);
#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
#include
#include "test.h"
int main()
其實也很簡單,輸入乙個簡單的命令就可以生成執行檔案了,
(1)首先輸入gcc hello.c -o hello ./libtest.a
(2)輸入./hello,驗證生成的執行檔案是否正確
(3)朋友們可以刪除libtest.a檔案,重新輸入./hello,驗證執行檔案是否可以正常執行
linux下的C語言開發(靜態庫)
在我們編寫軟體的過程當中,少不了需要使用別人的庫函式。因為大家知道,軟體是乙個協作的工程。作為個人來講,你不可能乙個人完成所有的工作。另外,網路上一些優秀的開源庫已經被業內廣泛接受,我們也沒有必要把時間浪費在這些重複的工作上面。既然說到了庫函式,那麼一般來說庫函式分為兩種方式 靜態庫和動態庫。兩者的...
Linux下C語言開發 動靜態庫的生成
0人收藏此文章,我要收藏 發表於2年前 已有440次閱讀 共0 我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還...
linux下的C語言開發(動態庫)
摘自 動態鏈結庫不是linux獨有的特性,在windows下面也存在這樣的特性。一般來說,windows下面的動態連線庫是以 dll作為結尾的,而linux下面的動態連線庫是以 so結尾的。和靜態鏈結庫相比,動態連線庫可以共享記憶體資源,這樣可以減少記憶體消耗。另外,動態連線是需要經過作業系統載入器...