在linux下有靜態庫和動態庫之分。
靜態庫在程式編譯時會被鏈結到目標**,目標程式執行時不再需要動態庫,移植方便,體積大,浪費空間和資源,因為所有相關的物件檔案與牽涉的庫被鏈結成乙個可執行檔案,這樣導致可執行檔案的體積較大。
動態庫在程式編譯時並不會鏈結到目標程式中,而是在程式執行時被載入,因此體積小。有了動態庫,程式公升級變得相對簡單,比如某個動態庫公升級了,只需要更換這個動態檔案,而不需要去更換可執行檔案。可執行檔案是動態庫的呼叫者。
靜態庫檔案的字尾是.a,在linux下一般命名為lib***.a。當有程式使用某個鏈結庫時,在鏈結步驟中,聯結器將從靜態庫檔案取得的**複製到生成的可執行檔案中,即整個庫中的所有函式都被鏈結到可執行檔案中。因此靜態庫的可執行檔案通常較大。
靜態庫的優點: 可執行程式最終執行時不需要和該庫有關的檔案支援,因為所有使用使用的函式已經被編譯進去,可執行檔案可以直接執行了。
靜態庫的缺點:靜態庫內容改變了,那麼整個程式的呼叫者必須重新編譯。
linux建立靜態庫的步驟如下:
1、編輯原始檔(例如 .c 和 .cpp檔案)。
2、通過gcc -c ***.c 或者 g++ -c ***.cpp生成目標檔案(即.o檔案)。
3、用ar歸檔目標檔案,生成靜態庫。
4、配合靜態庫寫乙個標頭檔案,檔案的內容就是提供給外部使用的函式、變數、或類的宣告。
#include #include using namespace std;
void fun(int age)
root@zhangziniu-dt:/mnt/d/projectcode/code/staticdemo# g++ -c test.cpp
root@zhangziniu-dt:/mnt/d/projectcode/code/staticdemo# ar rcs libtest.a test.o
注意:所生成的.a檔案的名字前3位必須是lib,否則在連線時,就可能導致找不到檔案。
#include using namespace std;
void fun(int age);
int main()
{ fun(66);
cout<<"hi"<-l:用來告訴g++去**找庫檔案,它後面的點,表示在當前目錄去找庫檔案。
-l:用來指定具體的庫,其中lib和.a不用顯示寫出,g++和gcc會自動去尋找libtest.a,這也是前面生成靜態庫檔名要用lib字首的原因。
注意:test.cpp檔案中不要寫main函式,不然必會報錯。
使用gcc和g++一樣,只要把g++換成gcc即可,其他皆相同。
建立和使用靜態庫 C
建立和使用靜態庫 c 我們將建立的下乙個庫型別是靜態庫 lib 使用靜態庫是重用 的一種絕佳方式。您不必在自己建立的每個程式中重新實現同一例程,而只需對這些例程編寫一次,然後從需要該功能的應用程式引用它們即可。本演練涵蓋以下內容 先決條件 本主題假定您具備 c 語言的基礎知識。從 檔案 選單中,選擇...
建立和使用靜態庫 C
我們將建立的下乙個庫型別是靜態庫 lib 使用靜態庫是重用 的一種絕佳方式。您不必在自己建立的每個程式中重新實現同一例程,而只需對這些例程編寫一次,然後從需要該功能的應用程式引用它們即可。本演練涵蓋以下內容 本主題假定您具備 c 語言的基礎知識。從 檔案 選單中,選擇 新建 然後選擇 專案 在 專案...
建立和使用靜態庫
我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在linux中如何建立靜態...