計算機科學中,靜態庫(英語:Static library, Statically-linked library),或稱靜態鏈接庫,是一個外部函式與變數的集合體。靜態函式庫的檔案內容,通常包含一堆程式設計師自定的變數與函式,其內容不像動態連結庫那麼複雜,在編譯期間由編譯器鏈接器將它整合至應用程式內,並製作成目的檔以及可以獨立運作的執行檔。而這個執行檔與編譯執行檔的程序,都是一種程式的靜態建立(static build)。以過去的觀點來說,函式庫只能算是靜態(static)類型。

需要特別指明的一點是,Linux系統下的靜態庫文件並非ELF二進制文件[1]

與動態鏈接庫的比較

編輯

優點

編輯

只需保證在開發者的計算機有正確的文件,在以二進制發布時不需考慮在使用者的計算機上庫文件是否存在及版本問題,可避免DLL地獄等問題。

缺點

編輯

生成的可執行文件體積較大。當初正是為了避免此問題,才開發了動態庫技術。

實現及使用

編輯

靜態函式庫可以用簡單的C語言或是C++程式碼去建立它。這兩個程式語言提供關鍵字指定函式與變數是否為外部(external)或是內部(internal)連結,此外,還提供其他的特性。

建立這類的函式庫時,將函式或是變數匯出(export)一定要用外部連結(external linkage )的語法特別指定它們。

靜態庫文件名為lib*.a,在使用了其中的函數之後,使用-l*參數要求連接器連入。

例如,在許多系統上,當使用了math.h中的函數後,需要使用-lm參數連接libm.a文件。

靜態庫文件名為*.lib,在使用了其中的函數之後,使用#pragma comment(lib,"*")預編譯指令要求連接器連入。

原始碼範例

編輯
 
這是主函式的原始碼與執行結果
靜態函式庫的原始碼範例
標頭檔案(Header File) 原始碼檔案(Source File)
// static_lib.h

# ifndef _STATIC_LIB_H_
# define _STATIC_LIB_H_

# include <iostream>
# include <string>
# include <Windows.h>

using namespace std;

namespace STAIC_LIB
{
BOOL PRINT(__in string& STRING);
}

# endif
// static_lib.cpp

# include "static_lib.h"

BOOL STAIC_LIB::PRINT(__in string& STRING)
{
if ( STRING.empty() )
{
return FALSE;
}
// 顯示一個字串
cout<<STRING<<endl;
return TRUE;
}

參見

編輯

外部連結

編輯
  1. ^ File format differences between a static library (.a) and a shared library (.so)?. [2021-09-02]. (原始內容存檔於2022-06-29).