静态库

在计算机科学中，靜態庫（），或称静态链接库，是一個外部函式與變數的集合體。靜態函式庫的檔案內容，通常包含一堆程式設計師自定的變數與函式，其內容不像動態連結庫那麼複雜，在編譯期間由編譯器與链接器將它整合至應用程式內，並製作成目的檔以及可以獨立運作的執行檔。而這個執行檔與編譯執行檔的程序，都是一種程式的靜態构建（static build）。历史上，程序库只能是静态的。静态库要么在构建时组合成为单个静态链接的可执行文件，要么在运行时加载到相应可执行文件的地址空间中。该地址空间是静态的，在编译期或链接期确定，与动态链接库不同。

需要特别指明的一点是，Linux系统下的静态库文件并非ELF二进制文件

 与动态链接库的比较 

 优点 
只需保证在开发者的计算机有正确的库文件，在以二进制发布时不需考虑在使用者的计算机上库文件是否存在及版本问题，可避免DLL地狱等问题。

 缺点 
生成的可执行文件体积较大。当初正是为了避免此问题，才开发了动态库技术。

 实现及使用 

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

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

 GCC 
静态库文件名为lib*.a，在使用了其中的函数之后，使用-l*参数要求连接器连入。

例如，在许多系统上，当使用了math.h中的函数后，需要使用-lm参数连接libm.a文件。

 Visual C++ 
静态库文件名为*.lib，在使用了其中的函数之后，使用#pragma comment(lib,"*")预编译指令要求连接器连入。

 原始碼範例 

 C/C++ 


+ 靜態函式庫的原始碼範例 標頭檔案（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;
}

 参见 

 函式庫
 链接器
 载入器
 共享库
 动态链接库
 外部变量
 目标文件
 预绑定

 外部連結 
 The C Book - Linkage. 

Category:计算机程序库